分类: Android平台
2014-12-10 15:05:44
1. Android应用如何开机自启动
1.1. 在AndroidManifest.xml中注册android.intent.action.BOOT_COMPLETED"
并添加对应的uses-permission:
1.2. Receiver接收广播进行处理
public class BootBroadcastReceiver extends BroadcastReceiver {
public static final String TAG = "BootBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction().toString();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
// do something.such as,start your service here
return;
}
}
}
2. 自启动失败的原因
接收不到BOOT_COMPLETED广播可能的原因
2.1. BOOT_COMPLETED对应的action和uses-permission没有一起添加
2.2. 应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的
2.3. 系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播
2.4. 应用程序安装后重来没有启动过,这种情况下应用程序接收不到任何广播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。Android3.1之后,系统为了加强了安全性控制,应用程序安装后或是(设置)应用管理中被强制关闭后处于stopped状态,在这种状态下接收不到任何广播,除非广播带有FLAG_INCLUDE_STOPPED_PACKAGES标志,而默认所有系统广播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就没法通过系统广播自启动了。
android 3.1中安装了但是从来没有启动过的apk,或者被用户在程序管理里面force stop了的apk,叫做stopped package,boot_complete广播是无法将启动的。
注: /system/app下面的apk都是非 stopped package
3. adb发送BOOT_COMPLETED
我们可以通过adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
命令发送BOOT_COMPLETED广播,而不用重启测试机或模拟器来测试BOOT_COMPLETED广播,也可以更精确的发送广播到某个package,如下:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name
转载资料: