14

私はAndroidプログラミングに慣れていないので、アプリを設計するための最良の方法を選択することに関していくつかの一般的な問題に直面しています。

私がやりたいのは基本的にメディアプレーヤーです。アクティビティが表示されていないときにも再生したいので、メディアプレーヤーをサービスで実行したい。

私の質問は、サービスのワークフローに応じてアクティビティのUIを更新するにはどうすればよいですか(たとえば、曲が変更され、その名前を表示したい場合)?

ローカルブロードキャストマネージャーを使用して、サービスからアクティビティにインテントを送信し、UIの更新を呼び出すことができると思います(正しいように見えますか?)

しかし...音楽の再生中にサービスで何かを実行したいと思います(DBのクエリ/更新など)。このため、私は別のプロセス(またはスレッド?)でサービスを実行することを考えていました。

SO ..別のプロセスでサービスを実行していると、ローカルブロードキャストマネージャーを使用できなくなります(これは正しいですか?)。

私の疑問は何であるかを説明したと思います...誰でも助けることができますか?

どうもありがとう!

4

1 に答える 1

15

サービスで非同期タスクを使用して、バックグラウンドで実行する必要のある作業を処理します。UIを更新する必要がある場合は、非同期タスクのprogressUpdateメソッドを使用して、関心のあるアクティビティにブロードキャストを送り返します。

疑似例。

アクティビティ

onCreate-> startServiceを実行し、新しいbroadcastReceiverを作成します。onReceiveメソッドをオーバーライドして、特定のインテントをテストしてください。

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(yourActionType)) {
                //do work here
            } 
        }
    };

onResume->放送受信機として登録

    IntentFilter filter = new IntentFilter();
    filter.addAction(yourActionType);
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);

サービス

onCreate->ブロードキャストマネージャーを作成します。

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

onStartCommand->必要に応じて、新しい非同期タスクを作成して実行します。(onStartは複数回呼び出すことができます)

非同期タスク

doInBackground->必要なバックグラウンドタスクを開始します。この場合、音楽を再生します。定期的にpublishProgressを呼び出します

onProgressUpdate->更新されたステータスを示すsendBroadcast

    Intent broadcastIntent = new Intent(yourActionType);
    broadcastIntent.putExtra(whateverExtraData you need to pass back);
    mLocalBroadcastManager.sendBroadcast(broadcastIntent);

onPostExecute->タスクが終了したことを示すsendBroadcast

于 2012-06-18T12:44:16.490 に答える