BroadcastReceiverにAndroid.intent.action.MEDIA_BUTTONと言わせて、新しいアクティビティを作成せずに現在のアクティビティのUIを更新したい場合、これに何か良い習慣はありますか?
私が知っていること(正しくないかもしれません)
1)BroadcastReceiverをアクティビティと同じクラスに配置し、特定のアクティビティの後にupdateUI関数を呼び出すことができます
2)ContentObserverを作成しますか?
3)アクティビティによって作成されたサービスに通信し、aidlを使用します。 (アクティビティから登録されている場合、現在のサービスを取得する方法がわかりません)
4)アクティビティと同じクラスにあるbroadcastReceiverでカスタムフィルターを作成し、context.sendBroadcast(カスタムフィルターのメッセージ)とカスタムフィルター呼び出しupdateUI(1つと同じですがより一般的ですか?)を使用します
最後のフローは、BroadcastReceiverから送信され、アクティビティを更新せずにUIを更新することです(アクティビティが停止している場合を除く)。
この種の問題にどのように取り組むかについてのリンク/ソースコードを提供してください。よろしくお願いします:)
この機能を提供する最も簡単な方法は、ブロードキャストレシーバーをアクティビティに配置し、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ファイルに適切な権限を追加する必要がある場合があります。
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");
}
}