1.自启动的实现
1.添加权限。<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2.在xml文件里,静态注册广播接收器。
3.实现具体自启动广播接收器类代码。
2 .接收不到BOOT_COMPLETED广播的情况1.应用处于stoped状态:安装完后没有启动(安装在/system/app/除外),或者被强制停止(看到很多帖子都说是强制关闭,有误解:认为直接kill进程会进入停止状态,其实是设置应用管理里面的“强制停止”)。是接收不到系统广播的(有的说是从3.1开始)。
2.应用安装在SD卡上,系统启动,发送BOOT_COMPLETED广播后,才会加载SD卡
3.其它广播来代替BOOT_COMPLETED
1.SD卡挂载广播:
<intent-filter > <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <data android:scheme="file" > </data> </intent-filter>
2.网络状态
4.自启动管理
1.pm disable-user/enable yourPackName/appName
但是呢这个有个问题,程序被完全禁止了。
2.通过setComponentEnabledSetting 去进行控制。
360等管理软件自启管理动应该是通过setComponentEnabledSetting 去实现的,但不明白如何拥有权限去控制的?望有知道的人可以告知下。为什么说360等控制自启动软件是通过setComponentEnabledSetting 实现的呢?我是这么测试的:
先安装个自启动的测试app(里面写了用setComponentEnabledSetting 把自己的广播接收Receiver激活的功能代码), 测试自启动成功后。
再用360把自启动给关掉。手机重启测试app已经无法自启动。
这时手动打开测试APP,运行激活广播接收器的代码(setComponentEnabledSetting )。
重启手机,自启动成功。
激活代码:
/* 激活receiver * @param * context 上下文 * name 要激活的receiver的名字--要带包名例:com.test.TimeReceiver*/ public void decide(Context context,String name) { pm=context.getPackageManager(); mComponentName=new ComponentName(context,name); if(pm.getComponentEnabledSetting(mComponentName)!=1) { pm.setComponentEnabledSetting(mComponentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } }
测试方法如果有问题忘指正,所以最后的结果是虽然不知道如何去控制别人的自启动,但还是可以保证自己的自启动接收器在激活状态。
5.不能静态注册的广播
1.android.intent.action.SCREEN_ON
2.android.intent.action.SCREEN_OFF
3.android.intent.action.BATTERY_CHANGED
4.android.intent.action.CONFIGURATION_CHANGED
5.android.intent.action.TIME_TICK