本文在CSDN同步更新:https://blog.csdn.net/weixin_42516118/article/details/107566092
在实际应用中开机启动app一般不被推荐,主要用在一些特定的场景,否则用户厌烦的话会马上把app卸载的,不过有的手机在app第一次使用的话会弹出提示是否禁止这个功能的。本Demo是在Android7.0上运行。
一、实现思路
当手机开机时一般会发送一条开机广播"android.intent.action.BOOT_COMPLETED",是不是这个时候只要我们的app能收到这条广播就可以打开自己的app了呢。但是心里想,app都没都有启动,怎么监听这个广播呢。翻阅网上的资料,还真的可以。
开机启动广播只要在app里面注册过一次,当手机开机的时候,app就算没有被打开也能收到这条广播,然后在自定义receiver接收到开机事件打开acitivity就可以[有坑,手动狗头]。
二、代码实现
BootBroadCastReceiver
public class BootBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
Intent myIntent = new Intent(context, MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//要加
myIntent.addCategory(Intent.CATEGORY_LAUNCHER);
myIntent.setAction(Intent.ACTION_MAIN);
context.startActivity(myIntent);
}
}
}
AndroidManifest注册广播
<receiver
android:name=".receiver.BootBroadCastReceiver"
android:enabled="true"
android:exported="true"
android:permission="true"
>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
实践后还不行,如果单单是这样写虽然接收到广播了,但是Activity并不能启动,查看logcat也没发觉什么异常,网上的搜索到的也模凌两可,并不能提供正确的思路,后面与小伙伴商量后觉得可能是【允许弹窗】这个权限的问题,需要提示用户打开权限,还需要打开【允许后台启动应用】,增加两个判断:
/**
* 功能描述: <小米/vivo/oppo允许后台启动应用>
* 〈〉
*
* @Param: [context]
* @Return: boolean
* @Author: yanghuajun
*/
public static boolean canBackgroundStart(Context context) {
AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
int op = 10021; // >= 23
// ops.checkOpNoThrow(op, uid, packageName)
Method method = ops.getClass().getMethod("checkOpNoThrow", new Class[]
{int.class, int.class, String.class}
);
Integer result = (Integer) method.invoke(ops, op, android.os.Process.myPid(), context.getPackageName());
return result == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) {
Log.e(TAG, "not support", e);
}
return false;
}
/**
* 功能描述: <允许弹窗,Android 6.0以上使用>
* 〈〉
*
* @Param: [activity]
* @Return: void
* @Author: yanghuajun
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public static void canDrawOverlays(Activity activity) {
//检查是否已经授予权限
if (!Settings.canDrawOverlays(activity)) {
AlertDialog dialog = new AlertDialog.Builder(activity)
.setIcon(R.mipmap.ic_launcher)//设置标题的图片
.setTitle("提示")//设置对话框的标题
.setCancelable(false)
.setMessage("请允许开启悬浮窗权限")//设置对话框的内容
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//若未授权则请求权限
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, 0);
dialog.dismiss();
}
}).create();
dialog.show();
}
}
还要注意的是,启动后不能手动杀死app,这样重启手机后app也是不能启动的。需要保持app的活动状态。