随着Android版本的不断升级,对于应用权限的管理会更加苛刻。我司IAC-RK3568-Kit开发板默认搭载Android11,相比较之前RK3288的产品安卓版本变更较大,有些客户反馈之前Android7.1自启动应用的方法在高版本安卓上无法生效,今天就对此展开讨论。

在早期版本中,大多数自启动应用的做法都是通过广播接收器接收开机广播,然后直接启动自己的应用,但是在高版本安卓中广播接收器的权限被严格限制,所以在logcat中你可以发现自己的应用并没有正常起来,并可能伴随着ANR的发生或程序因为某种超时被杀死的情况。
在高版本安卓中,服务的概念贯穿上层到底层,服务的便携性以及承上启下的作用使得它没有很多限制,可以在满足权限要求严格的广播接收器中正常启动,然后在服务中再自启动。所以具体根据需求我们需要重写相关方法,建立自己的服务,在服务中启动我们自己的UI,如下图所示:
服务的建立与启动逻辑完成之后,只需要在广播接收器中拉起建立服务即可,如下图所示:

当然,这些任务做完之后,AndroidManifest.xml里的权限也需要得到补充
正常启动之后可以发现应用已经常驻后台,通过状态栏可以看到应用在持续的运行中,那为什么没有显示到桌面launch前面呢?这主要是因为桌面launch是系统级应用,级别高于我们自己的应用,所以不允许显示在系统级应用之前。
针对这个问题,可以有两种解决思路,一是通过系统签名,将自己的应用打上系统签名,这样就可以显示在系统launch之前,二是通过修改安卓底层源码,framwork层,更改应用筛选条件,不再通过签名的方式辨别系统级应用还是我们自己的应用,这样也可以做到相同的效果。









