私の Android アプリには、長時間実行されるタスク (音楽の再生など) を実行するサービスがあり、実行中または一時停止中の 2 つの状態のいずれかになります。タスクを一時停止/再開するための単一の「一時停止/再開」画像ボタンがあります。また、(UI からではなく) 他の理由でタスクを一時停止することもできます。タスクの現在の状態 (実行中または一時停止中) によって、ボタンの外観が異なります。そのため、ボタン イメージをタスクの実際の状態と同期させる必要があります。
今、私は次の解決策を考え出しました:私のサービスには、次のようにインテントをそれ自体に送信する静的メソッドpause
とメソッドがあります:resume
public static void pause(Context context) {
Intent intent = new Intent(context, MyService.class);
intent.putExtra("PAUSE", true);
context.startService(intent);
}
public static void resume(Context context) {
Intent intent = new Intent(context, MyService.class);
intent.putExtra("RESUME", true);
context.startService(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getBooleanExtra("PAUSE", false)) {
doPause();
} else if (intent.getBooleanExtra("RESUME", false)) {
doResume();
}
return START_STICKY;
}
doPause()
anddoResume()
は他の場所からも呼び出すことができるため、 / を呼び出すときに ImageButton に画像を設定することはできません。MyService.pause()
ボタンMyService.resume()
の画像とタスクの実際の状態が同期しなくなる可能性があります。代わりに LocalBroadcastManager を使用して、ボタンを更新する必要があるときにアクティビティを通知します。
public void doPause() {
paused = true;
... // Do some stuff to pause the service
// Notify about state change
Intent intent = new Intent("SERIVCE_STATE_CHANGED");
intent.putExtra("PAUSED", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
のコードdoResume()
も同様です。したがって、私のアクティビティは受信者を登録し、画像を に設定しonReceive()
ます。
解決策はうまくいくようです。しかし、私の質問は、同じ目標を達成するためのより良い/より簡単な方法があるかどうかです? ベストプラクティスはありますか?