2019独角兽企业重金招聘Python工程师标准>>>

转载请标明出处:
http://blog.csdn.net/u011974987/article/details/50502769;
本文出自:【Xiho的博客】

先来说说我为什么写下这篇文章,最近再在一个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>

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();  }
}

上面就是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
flags:行为标签,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app
上面就是记录了package里面被禁止的组件信息。当然,package.xml里面还包含了应用包所有信息,这个可以自己看一下。
  这个组件只会运行一次,所以我们如果没有格式化/data目录,这个组件就会被禁止。所以会导致一个问题,就是我们的DEVICE_PROVISIONED标记不会再次写入。
 先说第一点: 这个条记录非常重要,代表设备已经准备就绪,可以正常使用,换句话说,如果没有这条记录的话,那设备是无法正常使用的。事实上还真是这样,因为系统中那一票 services 都回检测这个值,如果没有的话,都回相应的罢工,例如说无法锁屏、按 Home 键无反应、无法发通知等等。我之前在调一个东西的时候,需要清除 settings provider 中的某个数值,当时为了图简单,我就直接把 settings.db 删掉了。重启后系统各种问题,当时查了好久,坑死了。
然后后面第二点就解释为什么手动把 settings.db 删掉了,就各种不能用了,因为 provision 调用 pm 的 disable 把自己 disable 掉了。这就导致下次在启动 HOME 应用的时候,pm 回忽略 disabled 状态的应用。所以如果你手动把 settings.db 删掉了,下次重启就悲剧了。
知道原因了就很好办了,如果调试真的要删除 settings.db ,那自己手动插入 “device_provisioned = 1” 就可以了。
好了,大概就是这么多。

转载于:https://my.oschina.net/xuhaozi/blog/780393

Android Provision 的作用相关推荐

  1. Android Provision (OOBE)

    Android Provision (OOBE) 源码路径:android/packages/apps/Provision 在Android的原生代码中,Priovision只是一个第一次启动的设置向 ...

  2. android的适配器作用,适配器在Android中的作用是什么?

    适配器在Android中的作用是什么? 我想知道在Android环境中何时,何地以及如何使用适配器. 来自Android开发者文档的信息对我来说不够,我希望得到更详细的分析. 11个解决方案 39 v ...

  3. 腾讯、网易云、字节跳动面试点总结—AMS在Android起到什么作用?

    本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: AMS在Android起到什么作用,简单的分析下Android的源码 心理分析:这道题在发生在大多数场景下.面对这 ...

  4. android 自定义xmlns,Android xmlns 的作用及其自定义实例详解

    Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xm ...

  5. URI是什么,在Android中有什么作用?

    URI是什么,在Android中有什么作用? Android中的URI即通用资源标识符,Universal Resource Identifier, 简称URI. Uri代表要操作的数据,Androi ...

  6. Android Environment 的作用以及常用的方法

    从源码中可以看到这样一句话 Provides access to environment variables Environment的作用是:  提供对环境变量的访问 常见的方法 //外部存储设备的当 ...

  7. android 焦点的作用,Android中的视图焦点Focus的详细介绍

    在非触摸屏设备中接收事件和处理响应的控件是具有焦点(Focused)的控件.一个窗口中一个时间内只能有一个具有焦点的控件.在早期具有滚轮设备的android系统中以及现在的智能TV电视应用中视图的焦点 ...

  8. Android适配器以及作用,Android RecyclerView 通用适配器的实现

    分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...

  9. android布局的作用,Android UI布局经验总结

    如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...

  10. android注解的作用,Android 用注解来提升代码质量

    Android 用注解来提升代码质量 Android,注解,annotation 2018.07.13 Android 提供了一个注解的 support 包,这个注解包配合 IDE 可以用来提升我的代 ...

最新文章

  1. oracle 优化之批量处理bulk correct 和 forall
  2. html调用applet
  3. extmail从数据库导出通讯录
  4. [翻译] .NET Core 3.0 Preview 9 发布
  5. BX、DI、SI、BP总结
  6. asp.net网站编码测试
  7. 网页中查看pdf文档
  8. Git 各指令的本质,真是通俗易懂啊
  9. R7-3 出租 (20 分)
  10. MySQL SQL语句知识点总结
  11. 下载加载linux下用vmware-mount挂载vmdk虚拟硬盘分区
  12. 生日特惠餐厅 北京_黑色星期五特惠终极指南
  13. java webservice 入门教程_WebService入门实例教程
  14. js中的几种随机排序方案
  15. html调用矢量小图标的方法,Web 前端矢量小图标的使用方法
  16. js中给html元素追加属性,用JS(JavaScript )给HTML元素增加id属性
  17. 寻声定位 matlab,春天里的小情趣
  18. 第二层、三层、四层交换机原理
  19. 《寒江独钓 Windows内核安全》——串口的过滤
  20. TCP 三次握手原理,你真的理解吗?

热门文章

  1. python爬取微博设备显示怎么更改_Python定向爬虫模拟新浪微博登录
  2. 浙大超厉害计算机硕士生导师
  3. 的it生活_双子IT男性格随和、爱美食懂生活,会给女朋友准备小惊喜 | 企鹅来电VOL.03...
  4. python绘制饼图explode_python使用Matplotlib绘制饼图
  5. Halcon union_straight_contours_xld详解
  6. 资治通鉴-6 听的智慧
  7. vue使用原生高德地图
  8. form表单提交方式
  9. java post 403_Spring MVC Post请求返回403错误,Get请求却正常,可能是安全框架引起的前端解决办法...
  10. 用计算机怎么管理小米路由器,小米路由器3G怎么设置?(电脑)