Android 工控屏中 App 的自启动实现

文章目录

    搞了两块 Android 工控屏,需要系统重启后,能自动开启自己开发的这个蓝牙控制 App。找了半天没有找到系统设置,在哪里能指定某个 App 开机自启动。

    找了技术支持,大体意思是,这款主板是比较复杂一点,其他款的主板是可以的,这款主板只能在APP里面去设置自启动。然后留下一句话:

    把开机包名赋值给这个persist.spirit.bootapp属性就可以了,你试一下

    我 X,丈二和尚摸不着头脑,这个回复也太抽象了。于是我 google 了一下,完全没有匹配的关键词。让 AI 写,也完全不行。

    在 StackOverflow 上找到了解决方案:

    AndroidManifest.xml

        <!-- 添加开机广播权限 -->
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
    
       </application>
            <!-- 声明广播接收器 -->
            <receiver
                android:name=".BootReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
        </application>
    

    BootReceiver

    在 MainActivity.kt 的平级目录新建一个 BootReceiver.kt 文件:

    package com.sunzhongwei.app
    
    import android.content.BroadcastReceiver
    import android.content.Context
    import android.content.Intent
    import android.util.Log
    
    class BootReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
                // 创建启动主 Activity 的 Intent
                val mainIntent = Intent(context, MainActivity::class.java)
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                // 启动主 Activity
                context.startActivity(mainIntent)
                Log.d("BootReceiver", "App started on boot completed")
            }
        }
    }
    

    MainActivity.kt

    OnCreate 函数的最后,加上

            // 请求悬浮窗权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !Settings.canDrawOverlays(this)) {
                val intent = Intent(
                    Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:$packageName")
                )
                startActivityForResult(intent, 232)
            }
    

    由于系统是 Android 11 的系统,所以是没问题的。

    运行结果

    运行之后,会申请悬浮在其他app之上的权限,不了解为啥会需要这个权限。

    不过,重启 Android 系统之后,确实能自动启动这个 App 了。

    但是,还有个奇葩的 bug,其中一个屏幕在启动 app 后,会直接黑屏,需要点一下切换app 按钮,才能显示正常。。。又不支持数据线联机调试。。。明天试试 wifi 调试吧,这种山寨屏幕真得浪费生命。

    参考

    https://stackoverflow.com/questions/72972225/android-app-to-start-automatically-on-boot-up

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式