24

当我有一个 broadcastReceiver 说 android.intent.action.MEDIA_BUTTON 并且我想在不创建新活动的情况下更新当前活动的 UI 时,这有什么好的做法吗?

我知道的(可能不正确)

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

2) 创建一个 ContentObserver?

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

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

最后的流程是它将来自 BroadcastReceiver 并最终更新 UI 而无需更新活动(除非活动已死?)

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

4

2 回答 2

36

提供此功能的最简单方法是将广播接收器放入您的 Activity 并使用registerReceiverunregisterreceiver绑定/取消绑定它:

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文件添加适当的权限。

于 2010-10-24T23:51:06.383 回答
0

我最近在从 LocalBroadcastManager 接收数据后更改 Button 的文本所需要做的是将值存储在私有字段中,然后在我的 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");  
    }
}
于 2013-10-16T16:23:01.023 回答