私の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()
とdoResume()
は、他の場所からも呼び出すことができますので、 MyService.pause()
/MyService.resume()
を呼び出すときにImageButtonにイメージを設定するだけでは、ボタンイメージとタスクの実際の状態が同期しなくなることがあります。代わりに、私はボタンが更新されるときに活動を通知する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()
に設定します。
解決策は機能しているようです。しかし、私の質問は、同じ目標を達成するためのより良い/より簡単な方法があるかどうかです。ベストプラクティス?
ありがとう:
現在地GoogleのI/O 2016からデータバインディングについての詳細な映像を表示することができます。はるかに少ないコードのようです! – Mikhail
私はそれが非常にクールな機能だと思う。これは、状態/モデルをリンクする定型コードの多くをコードからXMLに移動させ、アクションをリンクすることも可能にして、これらの匿名の内部OnClickListenerクラスをすべて作成する必要がなくなります。 –