【问题标题】:Android Best Practice on Updating the UI from BroadcastReceiver to a certain activity将 UI 从 BroadcastReceiver 更新到特定活动的 Android 最佳实践
【发布时间】:2010-07-18 09:50:23
【问题描述】:

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

我知道的(可能不正确)

1)我可以把BroadcastReceiver和activity放在同一个类中,在某个activity之后调用updateUI函数

2) 创建一个 ContentObserver?

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

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

最终流程是来自 BroadcastReceiver 并最终更新 UI 而不更新活动(除非活动已死?)

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

【问题讨论】:

    标签: android android-activity broadcastreceiver


    【解决方案1】:

    提供此功能的最简单方法是将广播接收器放入您的 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 文件添加适当的权限。

    【讨论】:

    【解决方案2】:

    我最近在从 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");  
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多