Android 9中实现应用开机自启动(前台服务的方式)

Android 9(P)中实现应用开机自启动(前台服务的方式)

文章目录

  • Android 9(P)中实现应用开机自启动(前台服务的方式)
    • 问题1:开机之后没有收到BOOT_COMPLETED广播
    • 问题2:启动APP时直接报错
    • 问题3:无法启动service
    • 问题4: 广播中启动activity 出现错误
    • 问题5:开机后屏幕熄灭状态下也无法启动后台service
    • 写在最后

》大体思路:
	1.Android 系统开机后会发送一条广播
	2.应用收到广播后,启动相应的应用即可

问题1:开机之后没有收到BOOT_COMPLETED广播

可能情况:
	1.没有添加权限
	2.应用程序安装后,从未启动过,这种情况是接收不到任何广播的。
	3.没有ui的应用必须通过其他应用激活才能启动
解决方案:
	1.添加权限;
	2和3 直接将应用 放到/system/app目录下即可,这种状态下, 应用会被自动安装也会收到广播即使没有启动过
	
另外把app 放到/system/app目录下运行可能会遇到问题,可参考:

问题2:启动APP时直接报错

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/system/app/xxxx.apk”],nativeLibraryDirectories=[/system/lib/xxxx, /system/app/xxxx.apk!/lib/armeabi-v7a, /system/lib, /system/lib]]] couldn’t find ‘xxx.so’

解决方案:参考
1.Android 运行崩溃找不到so包解决方案
2.Android 设备的CPU类型(通常称为”ABIs”)

问题3:无法启动service

java.lang.IllegalStateException: Not allowed to start service Intent

解决方案:参考
1.Android 8.0 后台执行限制
2.解决java.lang.IllegalStateException: Not allowed to start service Intent
3.Context.startForegroundService

问题4: 广播中启动activity 出现错误

java.lang.RuntimeException: Unable to start receiver com.aaa.bbb.BootBroadcastReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

解决方案:增加一个标志即可

intentActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

参考:Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity

问题5:开机后屏幕熄灭状态下也无法启动后台service

解决思路:收到广播后,将熄灭的屏幕点亮,如果有锁屏则在锁屏的之上启动应用

	getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setShowWhenLocked(true);
        setTurnScreenOn(true);
        getSystemService(KeyguardManager.class).requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() {
            @Override
            public void onDismissError() {
                super.onDismissError();
            }

            @Override
            public void onDismissSucceeded() {
                super.onDismissSucceeded();
            }

            @Override
            public void onDismissCancelled() {
                super.onDismissCancelled();
            }
        });

参考:
1.android唤起app并点亮屏幕、覆盖锁屏显示
2.Android 屏蔽系统锁屏的方法
3.Android锁屏状态下弹出activity

写在最后

记录一下我在实现一个自动APP时遇到的问题

你可能感兴趣的:(Android)