当前位置:  ▪Android实用的代码片段 常用代码总结 iis7站长之家
本页文章导读:
    ▪froyo系统原生bug及匡正:改变系统语言时Launcher2的AllApps内shortcut不刷新        froyo系统原生bug及修正:改变系统语言时Launcher2的AllApps内shortcut不刷新 把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内部机制颇废了.........
    ▪ 开始写一些MTK的稿子        开始写一些MTK的文章 最近有项目要移植到MTK,在研究MTK的过程中希望把自己的点滴记下来,另外发现MTK的文档不多,也希望能跟大家分享。 ......
    ▪ 发现LinearLayout格局页面再次载入的时候会重新画一次,真的会吗       发现LinearLayout布局页面再次载入的时候会重新画一次,真的会吗? 今天写了个相对复杂的布局,有个header 还有个footer footer中又有两个按钮一个TextView ,中间是个文章的显示区,文章又有题.........

[1]froyo系统原生bug及匡正:改变系统语言时Launcher2的AllApps内shortcut不刷新
    来源: 互联网  发布时间: 2014-02-18
froyo系统原生bug及修正:改变系统语言时Launcher2的AllApps内shortcut不刷新

把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内部机制颇废了一番周折.也算见识了android系统内部的另一个面向切面编程案例,很有必要记录一下,有时间好好研究研究,可以借此做些特殊的系统功能.

 

严格意义上说,这并不是跨版本移植产生的问题,而是系统原生的一个bug,用samsung的galaxy tab平板模拟器测试同样是此现象:当在Launcher里面启动Settings,改变语言设置后,再回到Launcher,AllApps2D里面的shortcuts文字部分并不随之更新,还是保持原样.其它部分却已更新.

 

察看Settings源码可以知道,设置语言,改变的只是执行了如下代码:

        try {
            IActivityManager am = ActivityManagerNative.getDefault();
            Configuration config = am.getConfiguration();

            Loc loc = mLocales[position];
            config.locale = loc.locale;

            // indicate this isn't some passing default - the user wants this remembered
            config.userSetLocale = true;

            am.updateConfiguration(config);
            // Trigger the dirty bit for the Settings Provider.
            BackupManager.dataChanged("com.android.providers.settings");
        } catch (RemoteException e) {
            // Intentionally left blank
        }
        finish();
 

 

在configuration改变后,系统会让每一个切换到前台的Activity destroy,然后重新加载至原位置,非常奇妙的刷新操作,有时间要看看他如何保存当前状态的代码,比如,当前切换到前台的Activity是launcher,则会一直加载到allapps2d打开,而不是oncreate完成后的初始位置.对于状态机学习来说,Launcher无疑是很好的教科书.

 

然而,configuration的控制范围只是所有的Activity,Activity实现了一个接口ComponentCallbacks,里面有:

 

    /**
     * Called by the system when the device configuration changes while your
     * activity is running.  Note that this will <em>only</em> be called if
     * you have selected configurations you would like to handle with the
     * {@link android.R.attr#configChanges} attribute in your manifest.  If
     * any configuration change occurs that is not selected to be reported
     * by that attribute, then instead of reporting it the system will stop
     * and restart the activity (to have it launched with the new
     * configuration).
     * 
     * <p>At the time that this function has been called, your Resources
     * object will have been updated to return resource values matching the
     * new configuration.
     * 
     * @param newConfig The new device configuration.
     */
    public void onConfigurationChanged(Configuration newConfig) {
        mCalled = true;

        if (mWindow != null) {
            // Pass the configuration changed event to the window
            mWindow.onConfigurationChanged(newConfig);
        }
    }

 

 

而对于Launcher来说,allapps里面的内容是通过LauncherModel.java里面的线程类去异步加载的,重启Launcher这个Activity,并不会让LauncherModel里面的缓存的allapps内容刷新,Launcher是直接拿了LauncherModel里面缓存的query数据而不是通知loader线程重新获取,问题就出在这里了.

 

解决的方法并不复杂,Launcher在调onCreate()的时候,会调用checkForLocaleChange()方法检查是否语言设置是否被修改,我们定义一个boolean类变量,把语言设置是否改变存到里面,然后为LauncherModel重构一个startLoader方法,在onCreat()代码的相应位置调用此重构方法,把状态值传进去.在内部类Loader的loadAndBindAllApps()方法里,增加判断条件让语言改变时走loadAllAppsByBatch()路线即可.

 

我们来看看可以从中学到些什么?

1\定义和使用configuration的类变量,可以很好的传递任何全局数据,可以和硬件方便的通信.

2\利用configuration控制framework各模块ui.一个简单例子,在launcher中,利用语言设置变化,显示或隐藏不同语言环境的应用,比如面向国内市场的机器,youtube反正用不上,就可以隐藏掉.加上youku.平板电脑没有phone功能的,把phone的shortcut给拿掉.

3\另一个想法,能否利用configuration绕过系统权限实现截屏等需要root权限的功能?

1 楼 zhmeup 2011-07-26  
验证没? loadAllAppsByBatch能更新setting下的子菜单快捷方式?
2 楼 zhmeup 2011-07-26  
setting下的子菜单快捷方式 偶跟了两天,快有结果了
3 楼 烧伤的火柴 2012-03-05  
你好!你的文章没有配置.xml
我不太明白  能否再详细一点
loadAllAppsByBatch()这个方法在哪里?

    
[2] 开始写一些MTK的稿子
    来源: 互联网  发布时间: 2014-02-18
开始写一些MTK的文章
最近有项目要移植到MTK,在研究MTK的过程中希望把自己的点滴记下来,另外发现MTK的文档不多,也希望能跟大家分享。

    
[3] 发现LinearLayout格局页面再次载入的时候会重新画一次,真的会吗
    来源: 互联网  发布时间: 2014-02-18
发现LinearLayout布局页面再次载入的时候会重新画一次,真的会吗?
今天写了个相对复杂的布局,有个header 还有个footer footer中又有两个按钮一个TextView ,中间是个文章的显示区,文章又有题目和内容。
结果文章用了个TableLayout 外面只好包装上ScrollView .又用LinearLayout包装了tableLayout和一个广告的标签。

弄好这个后发现当一开始正常载入,但是当广告加载进来的时候TableLayout中的东西消失了,难道真的是重新画了一次吗?将LinearLayout改为RelativeLayout的就正常了。

先记下来,也欢迎高手指点

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3