如何从BroadCastReceiver更新Activity的UI

N S*_*rma 5 android broadcastreceiver android-activity

我正在学习Android概念ActivityBroadCastReceiver.我想更新的内容ActivityBroadtCastReceiver两者在不同的Java类.

它就像是

MyActivity.javaMyBroadtCastReceiver.java

这可以在Android中执行此操作吗?

Squ*_*onk 25

A BroadcastReceiver可以在很多方面使用,但是当涉及更新a的UI组件这样的特定事物时Activity,声明/定义BroadcastReceiver其自己的Java类文件几乎没有什么优势.

推理 - BroadcastReceiver必须具有一些先前的"知识" Activity以及为了更新UI而需要做什么.实际上,BroadcastReceiver它与Activity自身联系在一起,将它声明/定义为内部类是有意义的.

另一个重要方面是Activity需要处于"运行"(即可见)状态以保证UI组件的操作.在这种情况下,注册接收器onResume()和取消注册onPause()将有助于防止出现问题.

使用通用模板我会做类似以下的事情......

class MyActivity extends Activity {

    boolean mIsReceiverRegistered = false;
    MyBroadcastReceiver mReceiver = null;

    // onCreate(...) here

    @Override
    protected void onResume() {

        // Other onResume() code here

        if (!mIsReceiverRegistered) {
            if (mReceiver == null)
                mReceiver = new MyBroadcastReceiver();
            registerReceiver(mReceiver, new IntentFilter("YourIntentAction"));
            mIsReceiverRegistered = true;
        }
    }

    @Override    
    protected void onPause() {
        if (mIsReceiverRegistered) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
            mIsReceiverRegistered = false;
        }

        // Other onPause() code here

    }

    private void updateUI(Intent intent) {
        // Do what you need to do
    }

    private class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            updateUI(intent);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:一些额外的笔记......

  1. a的生命周期BroadcastReceiver在进入和离开之间onReceive(...).一旦它从onReceive(...)实例返回,则保持休眠状态,等待下一次广播.
  2. 与第1点直接相关 - a BroadcastReceiver不是为"重物提升"而设计的.基本上该onReceive(...)方法应尽可能简单.它调用的任何方法也应该尽可能轻量级...进入,做你的东西,然后离开然后等待下一个广播.如果更新UI需要一些时间(例如,可能ListView通过重新查询数据库以获取大量数据),请考虑调用异步执行的代码(AsyncTask例如).