App实现开机启动

本文在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注册广播


        
            
            
            
        
    

实践后还不行,如果单单是这样写虽然接收到广播了,但是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的活动状态。

你可能感兴趣的:(App实现开机启动)