android的APP开机自启动
应用范围
-一般不推荐使用开机自启动,但有时候终端会有这个要求,特别是嵌入式的安卓终端,我目前知道的有两种方法:
- 接受android系统的开机广播内容为ACTION_BOOT_COMPLETED;
- 从系统源码修改,直接改动launcher,再重新编译
-第二种我还在学习,学好了再来填坑,这个底层的参考资料太少了,大家知道了麻烦指导一下我,这篇主要讲第一种方法。
第一种方法虽然比较容易实现,但其实效果不怎么理想,大概会有3-5S的延迟才会从主界面进入目标程序。而且android5.0之后对系统的安全提高了,很多时候不能自启动,这个后面再说。
具体实现 ##`
- 注册一个广播
这里主要继承了BroadcastReceiver类
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Created with IntelliJ IDEA.
* User: qyg
* Date: 17-12-25
* Time: am 10.29
*/
public class Autostart extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)) {
Intent mainActivityIntent = new Intent(context, MainActivity.class); // 要启动的Activity
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent);
}
}
}
这里就注意两点:一是intent.getAction().equals(ACTION),是否接收到广播,二是addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
2. 写跳转的主程序
这个就是开机要进入的程序,这里写简单一点
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
public class MainActivity extends Activity { // 收到消息启动此Activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText("Helloworld");
setContentView(tv);
}
- 写配置文件manifest.xml
<receiver android:name=".Autostart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
注意要加上权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
到这里基本可以实现程序开机自启动了。
自启动失败原因
- 没有接收到广播,忘记加权限
- 应用安装到了SD卡,系统是先发广播再检测SD卡,所以安装在SD卡内,肯定接收不到广播信息i;
- android5.0之后,加强了系统的安全性,应用程序安装后或是(设置)应用管理中被强制关闭后处于stopped状态,在这种状态下接收不到任何广播,除非广播带有FLAG_INCLUDE_STOPPED_PACKAGES标志,而默认所有系统广播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就没法通过系统广播自启动了。不过我们可以用adb实现,adb push you.apkname /system/app/下是会自动启动的。