0

私の 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()ます。

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

4

1 に答える 1

1

あなたの解決策は悪くないと思います。ただし、間違いなく優れている別の方法は、Android データ バインディングを使用することです。

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

次に、レイアウトで、データ バインディングを使用してモデル オブジェクトの isPlaying 状態を UI にリンクしますが、設定したい場合は次のようになります。たとえば、次のようになります。

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

これがより良い解決策であると私が考える理由は、UI の状態をサービスと直接 1:1 でリンクするためです。概念的には、ブロードキャストは複数のソースから来ることができると想像しています。ただし、ブロードキャストのソースが 1 つしかないことに問題はないと思います。そのため、現在のソリューションが悪いとは思いません。

Google I/O 2016 のデータ バインディングに関する詳細なビデオは、https: //www.youtube.com/watch?v=DAmMN7m3wLUでご覧いただけます。

于 2016-09-12T14:04:36.700 に答える