Android Provision(开机向导setupwizard程序)
先来说说我为什么写下这篇文章,最近再在一个App,就相当于Android系统中 Provison.apk 的作用,可能很多朋友都不知道有这个APK 的存在。它的主要作用是作为开机引导用户进行一些基本设置。但是在原生的 android 系统中,这个 provision 非常的简单,只有一个空白的 activity,这个主要就是留给 厂商自己定制的(像 google 的 nexus 进行让里你登陆 google 帐号,连接WiFi等等一些功能)。
Android 原生的Provision 只做了一件事,就是写入一个DEVICE_PROVISIONED标记。不过这个标记作用很大,这个标记只会在系统全新升级(双清)的时候写入一次,代表了Android系统升级准备完成,可以正常工作。
之所以会关注DEVICE_PROVISIONED这个标记,是因为当用户操作完的App 的时候我设置了这个标记,等其他逻辑,导致外部程序进入的时候黑屏,为了排查原因,所以就从这入手了。于是,查资料,Google等。我项目里面也设置了一个属性比 Lanuch桌面启动还早,看下AndroidManifest.xml:
<application>
<activity android:name="DefaultActivity"
android:excludeFromRecents="true">
<intent-filter android:priority="1">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>12345678910
Provision 是 android 中的一个系统应用(源码位置在: packages/apps/Provision 下面)。
其实这个就是一个桌面而已,为什么比普通桌面启动快,只不过它把优先级设置得比普通桌面高了一点而已: android:priority=”1” ,普通桌面不设置的话,默认是 0。package manager 在解析 Intent 的时候会优先返回优先级高的。
如果两个优先级一样的话,你启动时候他会弹出一个对话框让你选择一个程序来执行。
从上面代码可以看到两个比较有意思的地方:
第一:Provision配置了category.HOME属性,做系统开发的朋友应该都了解,category.HOME是桌面程序的标记,简单点说就是Launcher程序才会配置的标记。
第二:priority=1,配置了优先级,也就是说它的优先级比我们原生的Launcher优先级还要高,它会在Launcher启动前就运行起来。
然后这个 apk 的就只有一个 activity:
public class DefaultActivity extends Activity {
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
// remove this activity from the package manager.
PackageManager pm = getPackageManager();
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
// terminate the activity.
finish();
}
}12345678910111213141516
上面就是Provision的全部源码,Provision只有一个Activity,而且做的事情不多。主要做了两件事:
设置DEVICE_PROVISIONED标记
禁止Provision自己的Activity组件
整个Provision程序只做了这两件事,DEVICE_PROVISIONED就是我们上面说的系统升级完标记。
禁止组件:
上面说了Provision其中一个功能,写入一个标记。除了写入标记,还有一个禁止本身Activity组件的功能。先简单介绍一下禁止组件的API。
void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
componentName:组件名称
newState:组件新的状态,可以设置三个值,分别是如下:
不可用状态:COMPONENT_ENABLED_STATE_DISABLED
可用状态:COMPONENT_ENABLED_STATE_ENABLED
默认状态:COMPONENT_ENABLED_STATE_DEFAULT
上面就是记录了package里面被禁止的组件信息。当然,package.xml里面还包含了应用包所有信息,这个可以自己看一下。
这个组件只会运行一次,所以我们如果没有格式化/data目录,这个组件就会被禁止。所以会导致一个问题,就是我们的DEVICE_PROVISIONED标记不会再次写入。
先说第一点: 这个条记录非常重要,代表设备已经准备就绪,可以正常使用,换句话说,如果没有这条记录的话,那设备是无法正常使用的。事实上还真是这样,因为系统中那一票 services 都回检测这个值,如果没有的话,都回相应的罢工,例如说无法锁屏、按 Home 键无反应、无法发通知等等各种坑爹问题~~
好了,大概就是这么多。
---------------------
原文:https://blog.csdn.net/u011974987/article/details/50502769/
Android Provision(开机向导setupwizard程序)相关推荐
- Android开机向导setupwizard,设置系统语言,WiFi向导
Android的框架设计有考虑到开机向导这一场景,因此我们实现开机向导参考Android的Provision.apk Provision: MSM8976/repo/packages/apps/Pro ...
- Android实现开机自动运行程序
有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以"Don't call me, I'll c ...
- 删除Android刷机启动开机向导(气泡提示)
删除Android刷机启动开机向导 ####1.文件位置 android/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java ...
- Android10定制Google开机向导
文章目录 1.简介 2.修改wizard_script.xml 3.编写自己的Activity 3.1 AndroidManifest.xml声明action 3.2 如何退出Activity 4 开 ...
- android 开机向导加载过程,开机向导启动流程分析
开机向导启动流程 首先来看Android启动流程: 1.Bootloader(系统启动加载器,将Linux加载到RAM): 2.Kernel 3.init进程 4.Zygote(Zygote进程是整个 ...
- Android开机向导启动流程分析
Android开机向导启动流程 首先来看Android启动流程: 1.Bootloader(系统启动加载器,将Linux加载到RAM): 2.Kernel 3.init进程 4.Zygote(Zygo ...
- Android 8.1自定义开机向导
在Android设备第一次上电的时候会进行一个国家和语言及搜台的选择,其具体的实现都是在Provision.apk 中实现的,对于Provision.apk 这个apk 应用大家可能比较陌生,它位于A ...
- Android 开机向导(没有优先启动问题)
1.设置了开机向导的相关属性却没有优先启动 <activity android:name="DefaultActivity"android:excludeFromRecent ...
- android 11.0 12.0自定义开机向导app
1.概述 在11.0 12.0的系统产品开发中,需要自定义开机向导app页面,而系统源码中只提供了Provision作为开机向导app 有些平台没有把它编译到源码中 作为开机向导,所以自定义开机向导, ...
- 完成谷歌Android设置向导,Android RRO机制的运用-----google开机向导客制化
上周五的时候领导分了一个任务,客户让在google开机向导里面增加一页,首先就想到了android的Overlay,然后网上搜了下,发下有很多人写了这方面的技术.而且写的都还不错,所以本篇只当记录作用 ...
最新文章
- java.lang.ClasNotFoundException:Didnt findclass on path:DexPathList[[zip file
- [MATLAB粒子模拟笔记]归一化输入系数
- 表格隔行变色_CSS实现鼠标悬停高亮
- 几种常用控件的使用方法
- 初识html 尝试图片标签 0907
- C++中使用set和unordered_set的find方法时遇到的小坑
- (转)Fabric 1.0 读写集
- 联想换机助手_Smart Switch.apk下载|S换机助手下载 v3.4.04 安卓版_最火软件站
- 游戏研发人才学校培养、企业需求与个人快速成长,华科校友分享了这些实用观点
- java使用zpl指令在Zebra打印机上打印条形码
- PCB工程的BOM表设置隔行隔列显示不同颜色操作方法
- java io流分为,Java中的IO流按照传输数据不同,可分为和
- Training: PHP LFI (Exploit, PHP, Training)
- 卡西欧计算机如何取消g,卡西欧g-shock怎么关闭闹钟 gshock取消闹钟方法
- 数据结构——马踏棋盘题解(贪心算法)(C语言)
- 武汉市下吴地形图国家2000地方坐标转WGS84案例
- 高房楼噪音测试软件,高层住宅噪音测试:11层分贝数高于其他楼层
- 微信小程序JS字符串操作方法汇总
- ue4.26 vlcMedia 播放监控rtsp流程 解决没有画面问题
- ikanalyer java_中文分词之Java实现使用IK Analyzer实现
热门文章
- 蓝牙音箱延迟测试软件,“Latency Test”详细操作流程,一款测试TWS耳机延迟的软件...
- 特征工程(Feature Engineering)
- 行测判断推理部分之图形推理(位置)
- 特斯拉硬核皮卡发布,现场却「碎了一地玻璃」
- 怒肝半月!Python 学习路线+资源大汇总
- 泰拉瑞亚 服务器linux,泰拉瑞亚Linux主机打造指南
- ElementUI(1):很好的前端开发框架
- Kafka安全认证 SASL/PLAINTEXT,账号密码认证
- 2022-2027年中国百元酒店行业市场全景评估及发展战略规划报告
- [转]如何高效迅速地进入500强外企