在安卓中,想要实现app开机自动启动,需要实现拦截广播android.permission.RECEIVE_BOOT_COMPLETED,
并且需要使用静态注册广播的方法(即在AndroidManifest.xml文件中定义广播)两者缺一不可。
1、在AndroidManifest.xml文件中声明权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
2、在AndroidManifest.xml文件中定义广播
<!--这里我们注册广播,亲测有用-->
<receiver
android:name=".receiver.BootBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
3、自定义广播
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String action_boot ="android.intent.action.BOOT_COMPLETED";
public BootBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(action_boot))
{
Intent i = new Intent(context, MainActivity.class);
//下面这行非常重要,如果缺少的话,程序将在启动时报错
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
4、看看首页Avtivity的代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("AutoRun","我成功开机启动了!");
}
}
5、然后连接手机进行运行(4.0之后运行后需要手动再打开程序一次才能完成初始化广播的操作);
6、重启手机,测试app有没有自动启动。如果有,那么恭喜你。如果没有,请往下看。
如果按照上面的全部步骤后操作后,重启没有自动启动程序,怎么办呢?是怎么回事呢?
一般有两种原因:其一就是查看下手机有没有装360之类的管家类软件,如果有打开在里面的启动管理模块找到自己的应用手动放开开机启动的权限,默认是没有放开的。
其二就是手机里看看是否有插外置SD卡,当内置存储空间不够时程序有时候会安装在外置SD卡里,这样开机后系统先发送开机启动完成的广播然后才会初始化外置SD卡,导致拦截不到开机广播,怎么处理呢?app安装到内部存储试试。如果不懂得设置的话,那么直接在AndroidManifest.xml文件中设置安装路径,android:installLocation="internalOnly"。比如:
<manifest
package="cn.weixq.autorun"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly">
如果会设置的朋友可以手动去设置安装在内部存储中也行,网上其他关于启动的例子挺多,不过不够详细,试过很多有时候都不行,想过很多问题,总结一下,希望看到的朋友学习下就不用再浪费时间踩这类问题的坑了。