自启管理 android,Android 自启动管理原理

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值