Android Toast叠加问题 XLIFF标签 广播注册接收 Content Provider

位置:platform/packages/apps/AlarmClock

1、同一应用中Toast调用多次,Toast消息叠加:

定义静态Toast对象,在新的Toast生成时关闭之前所有的Toast视图资源(包括正在显示的以及已加载但还在队列中没有显示的)。

public class ToastMaster {

   private static Toast sToast = null;

   private ToastMaster() {

   }

   public static void setToast(Toast toast) {
       if (sToast != null)
           sToast.cancel();
       sToast = toast;
   }

   public static void cancelToast() {
       if (sToast != null)
           sToast.cancel();
       sToast = null;

   }

}

2、广播消息的接收注册

//广播消息过滤
           IntentFilter filter = new IntentFilter();
           filter.addAction(Intent.ACTION_TIME_TICK);
           filter.addAction(Intent.ACTION_TIME_CHANGED);
           filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
           //注册广播监听以及Handler处理函数
           mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);

3、Content Provider

它主要用于App间的数据交换。

ContentValues是Content Provider的数据载体,它是对HashMap的一层封装,仅支持Byte、Short、Integer、Long、Float、Double、Boolean、Byte数组。

ContentResolver是Content Provider的操作类,包含CURD等一系列数据操作。

如果仅仅是在当前App中操作数据实体,SQLite是其他一个选择,但是Content Provider完全没必要。

如果App有以下几种需求,才建议使用Content Provider:

需要向其他App之间传递复杂数据或者文件;

允许用户从当前App拷贝复杂数据实体到其他App;

使用搜索框架来提供一套自定义的搜索建议。

4、xliff标签

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
   <string name="app_homeurl">
       Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g>
   </string>
   ...
</resources>

对字符串的国际化是通过不同标识文件夹下XML来实现的。但是在翻译过程中就会有些字符不需要翻译,比如代码示例中的URL,如果被翻译成中文就囧大了。这就是XLIFF标签的意义,保证字符串在被翻译为各种语言时保持原样不变。PS:需要在resources标签中添加 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" 才能识别xliff标签。

关于XLIFF的更多信息