咱們的app常常會包含一些繼承自Service或者IntentService的類。這些類的常常會用來處理系統或者app自身產生的一些Intent事件。 html
這是一種很方便的事件驅動模型。這裏我定義了一個IntentService的子類。這個類用來接收一個由AlarmManager產生的定時事件。這個類工做的很好。直到有一天,我很驚訝的發現這個類有的時候會很詭異的不工做,或者剛開始進入處理邏輯就退出了。因而就花了一些時間去定位和尋找緣由。如今緣由已經基本清楚了。 java
先上一段代碼: app
public class EventService extends IntentService { private static final String TAG = "EventService"; private PowerManager.WakeLock wl; public SchedulerEventService(String name) { super(name); } public SchedulerEventService() { super(TAG); } @Override public void onCreate() { Log.d(TAG, " EventService onCreate."); super.onCreate(); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "EventService"); wl.acquire(); } @Override public void onDestroy() { Log.d(TAG, " EventService onDestroy."); super.onDestroy(); wl.release(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); return (START_REDELIVER_INTENT); } @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "event received at: " + new Date().toString()); if (intent != null) { executeTask(); } } }
當個人測試手機在玩一個遊戲的時候,問題出來了。這個EventService在開始真正執行任務的時候:executeTask,詭異的退出來了。 ide
最終發現了問題:當遊戲的前臺運行的時候,很是耗費內存。當個人APP在後臺試圖啓動EventService的時候由於內存吃緊,被Android 系統殺死了。 測試
這裏有幾個連接也說明了相似問題: ui
http://blog.sina.com.cn/s/blog_5731032f0101be1t.html spa
http://q.cnblogs.com/q/43390/ .net
http://blog.csdn.net/mjm0771/article/details/6701023 code
解決的一個辦法是對OnStartCommand方法的Override。當這個方法返回 htm
START_REDELIVER_INTENT
的時候,系統從新啓動service以後會把最後一個intent從新再傳遞給咱們的service來處理。
若是碰到這種service被系統殺死的狀況,經過這種方式能夠給service一個機會從新再把最後一次沒作的事情作完。