2010-08-26 25 views
1

我有一個IntentService更新AppWidget。每次將AppWidget放置在屏幕上或調用AlarmManager/ContentObserver/OnChangeListener時,該服務都會啓動。它在更新小部件後自行停止。當沒有插件更新服務的生命週期以及註銷聽衆的最佳方式

UpdateService.java: 
@Override 
public void onCreate() { 
    contentObserver = new CustomContentObserver(); 
    registerContentObserver(contentObserver); 

    /* Am I registering several instances here or is this fine? */ 

    onChangeListener = new CustomSharedPreferencesOnChangeListener(); 
    sharedPreferences.registerOnSharedPreferenceChangeListener(onChangeListener); 

    Intent updateIntent = new Intent(this, UpdateService.class); 
    pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0); 
    alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    if(AppWidget.DISABLE.equals(intent.getAction())) { 
     unregisterContentObserver(contentObserver); 
     sharedPreferences.unregisterOnSharedPreferenceChangeListener(onChangeListener); 
     alarmManager.cancel(pendingIntent); 
    } else { 
     /* Scheduling next update */ 
     alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTime, pendingIntent); 

     /* Updating the Widget ... */ 
     updateWidget(); 

     /* Stopping the Service */ 
     stopSelf(); 
    } 
} 

服務應該無法啓動,所以我必須註銷監聽器和觀察者和取消掛起的意圖。

我想知道最好的方法是清理資源?啓動服務來阻止它對我來說似乎有點尷尬。

AppWidget.java: 
@Override 
public void onDisabled(Context context) { 
    Intent intent = new Intent(context, UpdateService.class); 
    intent.setAction(DISABLE); 
    context.startService(intent); 
    context.stopService(intent); 
    super.onDisabled(context); 
} 

我也想知道啓動和停止服務的成本。當最後一個部件被移除時,讓服務始終運行並在onDestroy()中清理會更好嗎?

回答

4

永遠不要在IntentService中註冊偵聽器,就像您從未在清單註冊BroadcastReceiver中註冊偵聽器一樣。這些應該是短命的對象。您的聽衆正在將您已停用的IntentService保存在內存中,並且一路上都在泄漏內存。

它會更好,讓服務 運行所有的時間和 的onDestroy清理()當最後一個小部件 刪除嗎?

當應用程序保持服務始終運行時,用戶會非常煩惱,除非他們清楚地瞭解其好處。我會避免這一點。

+1

感謝您的快速響應。那麼,當PreferenceScreen打開時,每次更改首選項時發送updateIntent,註冊ChangeListener會更好嗎? 你會在哪裏註冊ContentObserver? – Konrd 2010-08-26 13:33:52

+0

@konradf:「當PreferenceScreen每次改變首選項時打開發送updateIntent,註冊ChangeListener會更好嗎?」 - 這應該工作AFAIK。 「你在哪裏註冊ContentObserver?」 - 我不會。這對你沒有任何好處。根據你的計時器更新小部件 - 你不需要一個「ContentObserver」。如果你願意,可以更新你想要觀察的內容。 – CommonsWare 2010-08-26 22:49:16

+0

@CommonsWare那麼如果不在後臺服務中,管理後臺觀察者的最佳方式是什麼?只要系統還活着,我就希望觀察者活着。 – Olayinka 2015-04-16 20:20:42