2016-09-12 5 views
0

私のAndroidアプリには、実行中または一時停止の2つの状態のいずれかになる、長時間実行するタスク(例:音楽の再生)を実行するサービスがあります。タスクを一時停止/再開するための単一の「一時停止/再開」画像ボタンがあります。また、他の理由(UIからではない)のためにタスクを一時停止することもできます。ボタンは、タスクの現在の状態(実行中または一時停止中)によって異なって見えるはずです。だから私は、タスクの実際の状態とボタン画像を同期させる必要があります。実際の状態の「一時停止/再開」ボタンの画像を同期

今、私は以下のソリューションを作ってみた: 私のサービスは、このように自分自身にインテントを送っ静的pauseresumeのメソッドがあります。

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()に設定します。

解決策は機能しているようです。しかし、私の質問は、同じ目標を達成するためのより良い/より簡単な方法があるかどうかです。ベストプラクティス?

答えて

1

私はあなたの解決策が悪いとは思わない。ただし、Androidデータバインディングを使用することも、間違いなく良い方法です。

これが動作する方法は、サービス状態を表すモデルオブジェクトを作成することです。例えば。 Player.isPlaying:サービスの状態を表します。サービスでは、isPlaying状態を設定します。

次に、あなたのレイアウトでは、あなたがたとえば、しかし、あなたがそれを設定したい、UIの状態をisPlayingそのモデルのオブジェクトをリンクするためにデータバインディングを使用します:

android:background="@{player.isPlaying ? @drawable/pause : @drawable/play}" 

を、私はこれがかもしれないと思う理由より良い解決策は、サービスとUI状態を1:1で直接リンクすることです。概念的には、放送は複数のソースから来ていると想像しています。しかし、ブロードキャストのソースが1つしかないという問題はありませんが、現在のソリューションが悪いとは思われません。私は確かにそれを試してみてくださいよ、私はこの可能性について認識していなかった、https://www.youtube.com/watch?v=DAmMN7m3wLU

+0

ありがとう:

現在地GoogleのI/O 2016からデータバインディングについての詳細な映像を表示することができます。はるかに少ないコードのようです! – Mikhail

+0

私はそれが非常にクールな機能だと思う。これは、状態/モデルをリンクする定型コードの多くをコードからXMLに移動させ、アクションをリンクすることも可能にして、これらの匿名の内部OnClickListenerクラスをすべて作成する必要がなくなります。 –

関連する問題