Nitro's

Nov 20, 2013 - Comments - dev tech

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的更多信息