Android 自启动管理原理

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

 




[本日志由 admin 于 2013-10-22 10:19 AM 编辑]

有什么问题可以加群,100852896
点击这里加入此群 在线提问
文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 7766
博主QQ: 友情链接请找我
QQ群: 灰色档案
返回顶部 关闭