Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将用户界面从BroadcastReceiver更新到特定活动的最佳实践_Android_Android Activity_Broadcastreceiver - Fatal编程技术网

Android将用户界面从BroadcastReceiver更新到特定活动的最佳实践

Android将用户界面从BroadcastReceiver更新到特定活动的最佳实践,android,android-activity,broadcastreceiver,Android,Android Activity,Broadcastreceiver,当我有一个广播接收器,比如android.intent.action.MEDIA_按钮,并且我想在不创建新活动的情况下更新当前活动的UI时,这方面有什么好的做法吗 我所知道的(可能不正确) 1) 我可以将BroadcastReceiver与活动放在同一个类中,并在特定活动之后调用updateUI函数 2) 创建ContentObserver 3) 使用aidl与活动创建的服务通信。(如果当前服务是从活动中注册的,我不知道如何获取该服务) 4) 在与活动位于同一类的broadcastReceive

当我有一个广播接收器,比如android.intent.action.MEDIA_按钮,并且我想在不创建新活动的情况下更新当前活动的UI时,这方面有什么好的做法吗

我所知道的(可能不正确)

1) 我可以将BroadcastReceiver与活动放在同一个类中,并在特定活动之后调用updateUI函数

2) 创建ContentObserver

3) 使用aidl与活动创建的服务通信。(如果当前服务是从活动中注册的,我不知道如何获取该服务)

4) 在与活动位于同一类的broadcastReceiver上创建自定义筛选器,并使用context.sendBroadcast(自定义筛选器的消息)和自定义筛选器调用updateUI(与一个相同但更通用?)

最后一个流程是它将来自广播接收器,并最终更新UI而不更新活动(除非活动已停止?)


请提供您如何解决此类问题的链接/源代码。提前感谢:)

提供此功能的最简单方法是将广播接收器放入活动中,并使用registerReceiver和unregisterreceiver绑定/解除绑定:


根据您希望接收的目的,您可能需要向AndroidManifest.xml文件添加适当的权限。

最近我从LocalBroadcastManager接收数据后,要更改按钮的文本,必须将值存储在私有字段中,然后在我的onResume()方法中执行UI操作


还考虑这里给出的信息:
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
    }
}
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");  
    }
}