web-dev-qa-db-ja.com

Android UIをBroadcastReceiverから特定のアクティビティに更新するためのベストプラクティス

BroadcastReceiverにAndroid.intent.action.MEDIA_BUTTONと言わせて、新しいアクティビティを作成せずに現在のアクティビティのUIを更新したい場合、これに何か良い習慣はありますか?

私が知っていること(正しくないかもしれません)

1)BroadcastReceiverをアクティビティと同じクラスに配置し、特定のアクティビティの後にupdateUI関数を呼び出すことができます

2)ContentObserverを作成しますか?

3)アクティビティによって作成されたサービスに通信し、aidlを使用します。 (アクティビティから登録されている場合、現在のサービスを取得する方法がわかりません)

4)アクティビティと同じクラスにあるbroadcastReceiverでカスタムフィルターを作成し、context.sendBroadcast(カスタムフィルターのメッセージ)とカスタムフィルター呼び出しupdateUI(1つと同じですがより一般的ですか?)を使用します

最後のフローは、BroadcastReceiverから送信され、アクティビティを更新せずにUIを更新することです(アクティビティが停止している場合を除く)。

この種の問題にどのように取り組むかについてのリンク/ソースコードを提供してください。よろしくお願いします:)

24
monmonja

この機能を提供する最も簡単な方法は、ブロードキャストレシーバーをアクティビティに配置し、registerReceiverおよびnregisterreceiverを使用してバインド/バインド解除することです。

public class MyActivity extends Activity {
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            MyActivity.this.receivedBroadcast(intent);
        }
    };
    @Override
    public void onResume() {
        super.onResume();
        IntentFilter iff = new IntentFilter();
        iff.addAction("Android.intent.action.MEDIA_BUTTON");
        // Put whatever message you want to receive as the action
        this.registerReceiver(this.mBroadcastReceiver,iff);
    }
    @Override
    public void onPause() {
        super.onPause();
        this.unregisterReceiver(this.mBroadcastReceiver);
    }
    private void receivedBroadcast(Intent i) {
        // Put your receive handling code here
    }
}

受け取りたいインテントによっては、AndroidManifest.xmlファイルに適切な権限を追加する必要がある場合があります。

36
jwriteclub

LocalBroadcastManagerからデータを受信した後、ボタンのテキストを変更するために最近やらなければならなかったことは、値をプライベートフィールドに格納してから、onResume()メソッドでUI処理を実行することです。

public class myClass extends Activity {

    private String myString;

    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);         
        // register to receive data
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter("myAction"));      
    }

    private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // get the extra data included in the intent
            myString = intent.getStringExtra("myString");   
        }
    };

    @Override   
    public void onResume() {
        super.onResume();
        System.out.println("onResume");
        // do something to the UI
        myButton.setText(myString != null ? myString : "Default");  
    }
}
0
elmango