标 题: Android 自启动管理原理
作 者: web开发网[http://www.zeroplace.cn]
时 间: 2013/10/22 10:15:00
垃圾手机,用网上那种优化软件很多功能我用不到,还太占用内存,准备自己写一个自启动管理的软件。
网上搜索了一下,大致是说可以用PackageManager这个包来取得所有的应用列表,然后再来进行筛选。
因为安卓下面自启动大多是通过接收ACTION_BOOT_COMPLETED这个广播来完成的,所以我只要找到所有含有接收这个广播的BroadcastReceiver的包就可以了。
有了这个思路之后就可以去Android Developers找文档了,找到了PackageManager发现了一个queryBroadcastReceivers方法,它接收两个参数,一个是一个Intent,另一个是一个记号。
这个Intent简单构造一个就可以了。
new Intent(Intent.ACTION_BOOT_COMPLETED)
另外一个flag标记,在PackageManager这个文档页找了一下,大概是可以找到GET_DISABLED_COMPONENTS 表示可以包括已禁用的组件在内的列表。
List 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 and 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 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(Iterator iterator = 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);
}