網站首頁 編程語言 正文
經過多次嘗試之后,終于找到了開機自動啟動App的解決方法
開機后會停留在鎖屏頁面,且短時間內如果沒有進行解鎖操作,屏幕會進入休眠狀態,所以啟動APP時需要先喚醒屏幕和解鎖屏幕
定義一個廣播類BootBroadcastReceiver.java
public class BootBroadcastReceiver extends BroadcastReceiver { ? ? static final String ACTION = "android.intent.action.BOOT_COMPLETED"; ? ? @Override ? ? public void onReceive(Context context, Intent intent) { ? ? ? ? //屏幕喚醒 ? ? ? ? PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); ? ? ? ? PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP ? ? ? ? ? ? ? ? | PowerManager.SCREEN_DIM_WAKE_LOCK, "BootBroadcastReceiver"); ? ? ? ? wl.acquire(); ? ? ? ? //屏幕解鎖 ? ? ? ? KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); ? ? ? ? KeyguardManager.KeyguardLock kl = km.newKeyguardLock("BootBroadcastReceiver"); ? ? ? ? kl.disableKeyguard(); ? ? ? ? //啟動APP ? ? ? ? if (intent.getAction().equals(ACTION)) { ? ? ? ? ? ? Intent intent = new Intent(context, LaunchActivity.class); ?// 要啟動的Activity ? ? ? ? ? ? if (!(context instanceof Activity)) { ? ? ? ? ? ? ? ? //如果不是在Activity中顯示Activity,必須要設置FLAG_ACTIVITY_NEW_TASK標志 ? ? ? ? ? ? ? ? intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ? ? ? ? ? ? } ? ? ? ? ? ? context.startActivity(intent ); ? ? ? ? } ? ? } } ?
AndroidManifest.xml文件
1.添加權限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
2.注冊廣播
<receiver ? ? ?android:name=".receiver.BootBroadcastReceiver" ? ? ?android:enabled="true" ? ? ?android:exported="true" ? ? ?android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> ? ? ?<intent-filter> ? ? ? ? ? <action android:name="android.intent.action.BOOT_COMPLETED"/> ? ? ? ? ? <action android:name="android.intent.action.QUICKBOOT_POWERON"/> ? ? ? ? ? <category android:name="android.intent.category.DEFAULT"/> ? ? ? </intent-filter> </receiver>
注:intent-filter中的action要與BootBroadcastReceiver中定義的action相對應
在解決開機自啟的問題時發現了一篇文章記錄了自啟動失敗的原因,在這里mark一下
自啟動失敗的原因
接收不到BOOT_COMPLETED廣播可能的原因
1.BOOT_COMPLETED對應的action和uses-permission(”android.permission.RECEIVE_BOOT_COMPLETED” )沒有一起添加
2.應用安裝到了sd卡內,安裝在sd卡內的應用是收不到BOOT_COMPLETED廣播的,可以在manifest節點下添加android:installLocation=”internalOnly”來指定只能安裝在手機內存里面,也可以監聽開機加載sd卡的廣播,可惜有的手機是沒有sd卡的
3.系統開啟了Fast Boot模式,這種模式下系統啟動并不會發送BOOT_COMPLETED廣播
4.應用程序安裝后重來沒有啟動過,這種情況下應用程序接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等
5.Android3.1之后,系統為了加強了安全性控制,應用程序安裝后或是(設置)應用管理中被強制關閉后處于stopped狀態,在這種狀態下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標志,而默認所有系統廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒法通過系統廣播自啟動了。所以Android3.1之后
(1)、應用程序無法在安裝后自己啟動
(2)、沒有ui的程序必須通過其他應用激活才能啟動,如它的Activity、Service、Content Provider被其他應用調用。
6.存在一種例外,就是應用程序被adb push you.apk /system/app/下是會自動啟動的,不處于stopped狀態
原文鏈接:https://blog.csdn.net/sinat_25112321/article/details/80104714
相關推薦
- 2023-11-12 Check failed: top_shape[j] == bottom[i]->shape(j)
- 2022-11-03 C++11?寫一個只觸發一次槽函數的Qt?connect函數_C 語言
- 2022-10-31 ?Go?語言實現?HTTP?文件上傳和下載_Golang
- 2022-02-01 for循環中嵌套異步請求導致順序錯亂
- 2023-07-24 E6新語法for of 和ES3的for in 有什么區別?useState為什么是用數組結構而不用
- 2022-10-19 python用opencv將標注提取畫框到對應的圖像中_python
- 2022-05-02 dubbo服務使用redis注冊中心的系列異常解決_Redis
- 2022-08-17 Win2008系統搭建DHCP服務器_win服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支