Android 設(shè)備啟動的時候,會發(fā)送android.intent.action.BOOT_COMPLETED的廣播,監(jiān)聽這個廣播來實(shí)現(xiàn)開機(jī)自啟動。
開機(jī)自啟動service 的實(shí)現(xiàn)步驟
1) 創(chuàng)建需要的service和 BroadcastReceiver
2) 在AndroidManifest.xml 注冊service 和BroadcastReceiver
<service android:name=".MyService"
android:enabled="true"
android:exported="true" />
<receiver
android:name=".sheyi.proinfo.utils.BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="com.tencent.yishe.destroy" />//這個就是自定義的action
</intent-filter>
</receiver>
3)申明權(quán)限
```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
4) 在BroadcastReceiver 啟動服務(wù)
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
Log.d("BootReceiver", "system boot completed");
Intent service = new Intent(context, MyService.class);
context.startService(service);
// 啟動activity
/* Intent mainActivityIntent = new Intent(context, MainActivity.class); // 要啟動的Activity
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent); */
}
####坑
實(shí)踐發(fā)現(xiàn)通過以上方式是現(xiàn)實(shí)的開機(jī)自啟動服務(wù)在開機(jī)后并沒有自動運(yùn)行。原因是在Android3.1之后,系統(tǒng)為了加強(qiáng)了安全性控制,應(yīng)用程序安裝后或是(設(shè)置)應(yīng)用管理中被強(qiáng)制關(guān)閉后處于stopped狀態(tài),在這種狀態(tài)下接收不到任何廣播。對于android3.1以后版本,如果要應(yīng)用接收開機(jī)廣播有兩種方法:
a).將應(yīng)用預(yù)置到/system/app/目錄。
b).安裝應(yīng)用后先啟動一次。
*自啟動失敗的原因
接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對應(yīng)的action和uses-permission沒有一起添加
(2)、應(yīng)用安裝到了sd卡內(nèi),安裝在sd卡內(nèi)的應(yīng)用是收不到BOOT_COMPLETED廣播的
(3)、系統(tǒng)開啟了Fast Boot模式,這種模式下系統(tǒng)啟動并不會發(fā)送BOOT_COMPLETED廣播
(4)、應(yīng)用程序安裝后重來沒有啟動過,這種情況下應(yīng)用程序接收不到任何廣播,包括BOOT_COMPLETED
*