原文地址:Android 實現開機自啟APP - Stars-One的雜貨小窩
公司有個專案,需要實現自啟動的功能,本來想著是設定桌面啟動器的方式去實現,但是裝置是華為平板(EMUI系統),不允許設定第三方桌面
且監聽開機廣播也無效,本來以為沒法實現了,沒想到公司的另一款APP確實支援,於是便是研究了下,發現監聽開機廣播的方式,還需要加上個懸浮窗許可權即可實現功能
然後也是趁著機會來總結下
在AndroidMainfest中,將首頁的Activity設定一下屬性即可
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<category android:name="android.intent.category.HOME" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
使用靜態廣播實現自啟功能
AndroidManifest檔案中宣告許可權:
<!-- 開機監聽-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 懸浮窗-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
宣告廣播:
<receiver
android:name=".AutoStartReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
AutoStartReceiver類程式碼實現:
public class AutoStartReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//開機啟動
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent thisIntent = new Intent(context, MainActivity.class);//設定要啟動的app
thisIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(thisIntent);
}
}
}
在主Activity裡申請懸浮窗許可權
//檢查是否已經授予許可權,大於6.0的系統適用,小於6.0系統預設開啟,無需理會
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
//沒有許可權,須要申請許可權,由於是開啟一個受權頁面,因此拿不到返回狀態的,因此建議是在onResume方法中重新執行一次校驗
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
測試時候需要注意,使用這種方法,都是需要啟動一次APP,之後自啟才會實現
手中有臺Android11的裝置,測試發現不加懸浮窗,也是無法在開機後啟動APP
而華為平板裡的系統是Android10,所以斷定Android 10以上估計都要申請懸浮窗許可權才能實現
同事的手機是鴻蒙系統,加了懸浮窗還是無法自啟
注意:
華為手機或平板都需要去設定應用的啟動管理,其他系統可參考此設定