开机向导两三事
来源:互联网 发布:红色警戒2网络打不开 编辑:程序博客网 时间:2024/04/25 22:43
这段时间一直搞开机向导。大概记录一下。
其实开机向导没有什么复杂的场景,是个比较简单的apk,只是作为第一个应用,有些特殊。
1.首先,开机向导最根本的目的,是为了完成:
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
这两个值在很多地方都会有影响,比如SystemUI中,很多地方都会根据这两个值,做出一些限制。
2.其次,开机向导工作量较大的地方,就是在和Settings中模块交互的地方:
a).WifiSettings,如果开机向导中有wifi设置的界面,那么就会与这个类有关系,此类修改需要谨慎。b).ChooseLockXXXX。如果开机向导中有锁屏密码设置的界面,那么就会与这几个类有关,这几个类在重用的时候要谨慎,最好能直接重用。c).Fingerprint.同上,指纹相关的界面也是如此。
这几处地方,由于与原有模块相关性很高,容易在修改时引入问题,需要慎重。
3.其他:
a).开机向导会在结束时disable掉自己,比如在原生的开机向导中,会调用:
ComponentName name = new ComponentName(this, DefaultActivity.class);pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
以此来使得开机向导只在用户眼中出现一次,恢复出厂才会再出现。
另外的,也可以关注下setApplicationEnabledSetting(String appPackageName,int newState, int flags, int userId, String callingPackage)这个方法
b).在原生的开机向导中其实还有设置launcher的操作。只不过我们基本没有这种使用的场景。
//if Launcher3 is not found, do not set anything if(defaultMatch == -1){ return; } IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MAIN); filter.addCategory(Intent.CATEGORY_HOME); filter.addCategory(Intent.CATEGORY_DEFAULT); pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
c).开机向导也可能会与其他模块有相互调用,比如说,某个项目上需要在开机向导中设置主题。
这时候调用跳转容易出问题,需要在关键点输出log。
d).在开机向导之前会有启动一个FallbackHome类,此类的作用就是在isUserUnlocked后启动Home属性的apk。
private void maybeFinish() { if (getSystemService(UserManager.class).isUserUnlocked()) { final Intent homeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME); final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0); if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) { Log.d(TAG, "User unlocked but no home; let's hope someone enables one soon?"); mHandler.sendEmptyMessageDelayed(0, 500); } else { Log.d(TAG, "User unlocked and real home found; let's go!"); getSystemService(PowerManager.class).userActivity( SystemClock.uptimeMillis(), false); finish(); } } }
为什么是FallbackHome?
——这是因为Settings中配置了android:directBootAware="true"这个属性。
这个属性是干啥的?
——粘贴一下: 当手机已经通电开机但是用户并有解锁锁屏的时候,Android N运行于一个安全的模式,也就是Dierect Boot模式。 为了支持Dierect Boot模式,系统提供了两个存储数据的地方: 1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。 2.Device encrypted storage,主要对应的就是Direct Boot使用的存储空间。在Direct Boot模式下和用户解锁手机后都可以使用的存储空间。 引用自[Android7.0 DirectBoot阻塞开机分析](http://blog.csdn.net/fu_kevin0606/article/details/65437594)
e)其他的开机向导.有其他一些厂商的开机向导是以activity中viewpager切换fragment的方式来实现的,整个APK只维持两个Activity,并且基本上所有的界面都是在该APK内实现的.这样的好处是显而易见的—-便于移植.
阅读全文
0 0
- 开机向导两三事
- android 开机向导
- android开机向导实现
- 开机向导实现原理
- Android4.4开机向导
- 儿子的两三事
- LCD调试两三事
- code review 两三事
- 截屏两三事
- 程序两三事
- 童年生活两三事
- MySql两三事
- 烦事两三点
- AlertDialog两三事
- telnet两三事
- 关于 排序 两三事
- 学生系统两三事
- Erlang Unicode 两三事
- HttpServletRequest简介
- 分答项目_技能点:客户端和服务端调试?
- mac 安装gcc,提示missing xrun的处理办法
- 拒绝服务型攻击
- HDU
- 开机向导两三事
- 010大数据课程知识点小结
- pat乙级真题 1033. 旧键盘打字(20)
- Android Handler消息机制源码分析
- Spring事务管理(详解+实例)
- linux学习2(文件与目录管理)
- 字符串操作函数知识框图
- 5G:认识5G关键技术
- OGNL表达式