万事须己运,他得非我贤。这篇文章主要讲述Android开机自启动应用相关的知识,希望能为你提供帮助。
问题场景
最近开发一个展示类应用项目,展示设备为若干个24小时运行的android广告机。考虑到停电的情况该应用需要开机自启动。
背景知识
- 当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。
- android开发中的基本概念:Activity。Activity简单的理解为android的视图,承载着android的人机交互。一个应用程序可以有多个Activity,其中有一个Activity为应用程序启动时最先启动的。 该Activity在AndroidManifest.xml中的具体形式如下。intent-filter中两项android.intent.action.MAIN
和
android.intent.category.LAUNCHER表示该activity为应用程序启动主界面
方案:
- AndroidMainfest.xml中添加开机启动权限
< uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 创建一个广播接收类
package io.dcloud.yourapp; //要修改成工程的包名 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import io.dcloud.PandoraEntry; //H5+SDKpublic class BootBroadcastReceiver extends BroadcastReceiver {static final String action_boot="android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) {if (intent.getAction().equals(action_boot)){// 注意H5+SDK的Main Activity为PandoraEntry(见AndroidMainfest.xml) Intent bootMainIntent = new Intent(context, PandoraEntry.class); // 这里必须为FLAG_ACTIVITY_NEW_TASK bootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(bootMainIntent); }} }
- 在AndroidMainfest.xml中注册该广播接收类
< !--开机自启动--> < receiver android:name=".BootBroadcastReceiver"> < intent-filter> < action android:name="android.intent.action.BOOT_COMPLETED" /> < category android:name="android.intent.category.LAUNCHER"> < /category> < /intent-filter> < /receiver>
- 请注意BootBroadcastReceiver的命名空间,要保证AndroidMainfest.xml中receiver可以找的到我们创建的BootBroadcastReceiver类。
- 应用程序必须在Android中启动一次,下次才可以开机启动。
原文地址:https://ask.dcloud.net.cn/article/id-689__page-2
下面是我写的代码。使用H5+SDK离线打包,在Android一体机中实验成功。
【Android开机自启动应用】AndroidMainfest.xml完整配置
< uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
< application android:name="io.dcloud.application.DCloudApplication" android:allowClearUserData="https://www.songbingjia.com/android/true" android:exported="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true"> < activity android:name="io.dcloud.PandoraEntry" android:configChanges="orientation|keyboardHidden|keyboard|navigation" android:label="@string/app_name" android:launchMode="singleTask" android:hardwareAccelerated="true" android:theme="@style/TranslucentTheme" android:screenOrientation="user" android:windowSoftInputMode="adjustResize" > < intent-filter> < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> < /intent-filter> < /activity> < !--开机自启动-->
< receiver android:name=".BootBroadcastReceiver"> < intent-filter> < action android:name="android.intent.action.BOOT_COMPLETED" /> < category android:name="android.intent.category.LAUNCHER"> < /category> < /intent-filter> < /receiver>
< /application>
推荐阅读
- 报错RuntimeError: Model class apps.user.models.User doesn't declare an explicit app_label and isn&
- Android001 开发环境安装(详细)
- 浅谈物联网操作系统选择,浏览器比安卓更合适!
- Android中三种创建监听器的方法
- android常用控件和布局
- [Trouble shooting] Alt-A shortcut taken by another app and conflict with Emacs' M-a
- Android Activity间跳转与传递数据
- flume 启动agent报No appenders could be found for logger的解决
- 抖音BoostMultiDex优化实践(Android低版本上APP首次启动时间减少80%)