定義一個健壯的Android Service (IntentService)類

    咱們的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一個機會從新再把最後一次沒作的事情作完。

相關文章
相關標籤/搜索