1.自啟動
需要獲取自啟動權限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
這個權限在4.0以后必須需要。否則無法獲取到廣播。
然后我們在廣播中獲取這個通知,然后進行相應的操作:
1 package com.example.com.mac.bootdeme; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.IBinder; 6 import android.util.Log; 7 8 public class BootService extends Service { 9 String Tag = "BootService"; 10 11 @Override 12 public void onCreate() { 13 // TODO Auto-generated method stub 14 Log.i(Tag, "onCreate"); 15 super.onCreate(); 16 } 17 18 @Override 19 public int onStartCommand(Intent intent, int flags, int startId) { 20 // TODO Auto-generated method stub 21 Log.i(Tag, "onStartCommand"); 22 new Thread(new Runnable() { 23 24 @Override 25 public void run() { 26 // TODO Auto-generated method stub 27 while (true) { 28 Log.i(Tag, "執行Service Action"); 29 try { 30 Thread.sleep(1000); 31 } catch (InterruptedException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 } 36 } 37 }).start(); 38 return START_STICKY; 39 } 40 41 @Override 42 public IBinder onBind(Intent intent) { 43 // TODO Auto-generated method stub 44 Log.i(Tag, "onBind"); 45 return null; 46 } 47 48 @Override 49 public void onDestroy() { 50 // TODO Auto-generated method stub 51 Log.i(Tag, "onDestroy"); 52 super.onDestroy(); 53 } 54 }
下面我來談談這個自啟動出現的問題:
a).手機差異,比如:我的小米手機無法獲取到通知,需要在權限控制中進行設置。

但是不知道為什么微信和QQ在安裝上以后默認會有自啟動權限,我懷疑是跟各廠商進行合作開放了自啟動接口。小米v5默認是在啟動后不會給app接收到廣播的。這個如果有哪位高手知道的請告訴我。
b).關於Service一直保存

START_STICKY:如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨后系統會嘗試重新創建service,由於服務狀態為開始狀態,所以創建服務后一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那么參數Intent將為null。
START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完onStartCommand后,服務被異常kill掉,系統不會自動重啟該服務。
START_REDELIVER_INTENT:重傳Intent。使用這個返回值時,如果在執行完onStartCommand后,服務被異常kill掉,系統會自動重啟該服務,並將Intent的值傳入。
START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保證服務被kill后一定能重啟。
2.關於一個App多個進程
相關配置 android:process="XXX"
<service android:name="com.example.com.mac.bootdeme.BootService" android:process="com.example.com.mac.bootdeme.BootService" > </service>
默認情況下android中所有的組件都隨包名走,所以只會在Setting中出現一個進程一個服務。如果想讓某一個組件單出來,那么android:process 配置成和包名不一樣的,就會是另一個進程,那么就會出現類似微信和支付寶這樣的現象。

