1

AppWidgetを更新するIntentServiceがあります。このサービスは、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

1 に答える 1

4

IntentServiceマニフェストにリスナーを登録しないのと同じように、リスナーをに登録しないでくださいBroadcastReceiver。これらは短命のオブジェクトであると思われます。あなたのリスナーはあなたの記憶を失い続けてIntentServiceおり、途中でメモリリークを起こしている。

最後のウィジェットが削除されたときに、サービスを常に実行し、onDestroy()でクリーンアップする方がよいでしょうか?

アプリケーションが利点を明確に理解していない限り、アプリケーションが常にサービスを実行し続けると、ユーザーは非常にイライラします。私はこれを避けます。

于 2010-08-26T12:41:22.247 に答える