Android 自启动管理原理
作者:admin 日期:2013-10-22
标 题: Android 自启动管理原理
作 者: web开发网[http://www.zeroplace.cn]
时 间: 2013/10/22 10:15:00
链 接: http://www.zeroplace.cn/article.asp?id=875
说 明: 转载请保留本段文字
垃圾手机,用网上那种优化软件很多功能我用不到,还太占用内存,准备自己写一个自启动管理的软件。
网上搜索了一下,大致是说可以用PackageManager这个包来取得所有的应用列表,然后再来进行筛选。
因为安卓下面自启动大多是通过接收ACTION_BOOT_COMPLETED这个广播来完成的,所以我只要找到所有含有接收这个广播的BroadcastReceiver的包就可以了。
有了这个思路之后就可以去Android Developers找文档了,找到了PackageManager发现了一个queryBroadcastReceivers方法,它接收两个参数,一个是一个Intent,另一个是一个记号。
这个Intent简单构造一个就可以了。
new Intent(Intent.ACTION_BOOT_COMPLETED)
另外一个flag标记,在PackageManager这个文档页找了一下,大概是可以找到GET_DISABLED_COMPONENTS 表示可以包括已禁用的组件在内的列表。
List<ResolveInfo> list = pm.queryBroadcastReceivers(new Intent(Intent.ACTION_BOOT_COMPLETED), PackageManager.GET_DISABLED_COMPONENTS);
这样就得到了一个列表,这个列表包含了已禁用的应用,如何判断这个应用的自启动状态是启用还是禁用呢?
这个我一开始摸索到的是ActivityInfo.enabled这个属性,发现这个属性始终为true,无论这个应用是在启用还是禁用状态。后来发现了一句话
Information you can retrieve about a particular application activity or receiver. This corresponds to information collected from the AndroidManifest.xml's <activity> and <receiver> tags.
大致是说这个ActivityInfo类忠于AndroidManifest.xml的receiver的标签的,也就是说安装完成后对这个组件的状态进行设置是没有效果的。
真正控制组件状态的地方是在PackageManager的getComponentEnabledSetting。这个函数大致返回三个值,
COMPONENT_ENABLED_STATE_ENABLED 启用
COMPONENT_ENABLED_STATE_DISABLED 禁用
COMPONENT_ENABLED_STATE_DEFAULT 默认
默认的意思大概就是说定义在androidManifest.xml中的那个状态,我们只要判断是否为disabled就可以了。
String stat = null; ComponentName compName = new ComponentName(appInfo.packageName, info.activityInfo.name); if (pm.getComponentEnabledSetting(compName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { stat = " 启用"; } else { stat = " 禁用"; }
// Java的代码就是动不动就会很一句话很长,这里不用三元操作了...蛋疼
这样基本的测试就完成了,代码如下
public void onResume() { super.onResume(); StringBuilder builder = new StringBuilder(); pm = getPackageManager(); List<ResolveInfo> list = pm.queryBroadcastReceivers(new Intent(Intent.ACTION_BOOT_COMPLETED), PackageManager.GET_DISABLED_COMPONENTS); int count = list.size(); builder.append("共 " + count + " 个应用\n"); int autoStartCount = 0; for(Iteratoriterator = list.iterator(); iterator.hasNext(); ) { ResolveInfo info = iterator.next(); ApplicationInfo appInfo = info.activityInfo.applicationInfo; if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) !=0 ) { continue; } autoStartCount++; String label = (String) pm.getApplicationLabel(appInfo); String packageName = appInfo.packageName; String stat = null; ComponentName compName = new ComponentName(appInfo.packageName, info.activityInfo.name); if (pm.getComponentEnabledSetting(compName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { stat = " 启用"; } else { stat = " 禁用"; } builder.append(label + stat); builder.append("\n"); builder.append(packageName); builder.append("\n"); builder.append("------------------------\n"); } builder.append("共 " + autoStartCount +" 个应用\n"); textView.setText(builder); }