android - 如何在 BroadcastReceiver 中更新 UI

标签 android broadcastreceiver

我创建了一个应用程序,在该应用程序中我在我的主类 (Main Activity) 中注册了一个广播接收器,每当我在 BroadcastReceiver 中收到一些东西时,我都想更新 UI例如我想显示一个警告框或设置我的 MainActivity 的一些 TextView 。我收到接收器中的所有值但无法设置它们,有人可以帮助我,以便我可以在 BroadcastReceiver 中更新我的 UI。

我的 BroadcastReceiver 类是 MainActivity 的内部类,如下所示:-

public class MainActivity extends Activity {

   ..........

public static class NissanTabBroadcast extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            SharedPreferences shrd = context.getSharedPreferences("NissanGallery", context.MODE_WORLD_READABLE);
            type = shrd.getString("type", "null");
            badges = shrd.getString("badge_count", "null");

            //badge_tips_text.setText(badges);
            /*Editor edit =  shrd.edit();
            edit.remove("type");*/

            Toast.makeText(context, "" + type + "\n" + badge_tips_text.getText().toString(), Toast.LENGTH_LONG).show();
        }
    }
}

任何帮助将不胜感激

谢谢

最佳答案

我建议你使用 Handler。

  1. 在Activity中初始化一个Handler,例如:handler = new Handler()
  2. 在构造函数中为 BroadcastReceiver 提供处理程序,就像我在上面为 NissanTabBroadcast 所做的那样
  3. onReceive() 方法中使用 Handler 实例的 post() 方法提交更新 UI 的 Runnable

这是我能想象到的最干净的解决方案。

public class MainActivity extends Activity {

    private MyReceiver receiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        receiver = new MyReceiver(new Handler()); // Create the receiver
        registerReceiver(receiver, new IntentFilter("some.action")); // Register receiver

        sendBroadcast(new Intent("some.action")); // Send an example Intent
    }

    public static class MyReceiver extends BroadcastReceiver {

        private final Handler handler; // Handler used to execute code on the UI thread

        public MyReceiver(Handler handler) {
            this.handler = handler;
        }

        @Override
        public void onReceive(final Context context, Intent intent) {
            // Post the UI updating code to our Handler
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

关于android - 如何在 BroadcastReceiver 中更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643385/

相关文章:

android - 有什么方法可以使用注释 @Binds 而不是 @Provides 和需要参数的返回类型

android - 如何关闭 Activity 并返回到android中的上一个 Activity

android - 小部件。 Activity 泄露了 IntentReceiver

java - 如何在 Android 应用程序中安全地将一个 Intent 额外发送到多个接收者

java - Android Java - 广播接收器 - 应用程序通知

java - 将数据从广播接收器发送到正在运行的服务

java - myDate 无法解析为变量

android - Google Ad Manager AdListener#onAdClicked() 回调未触发

android - 为不同的 Activity 处理相同的 Intent 过滤器

Android,使用 BOOT_COMPLETED Intent 拒绝权限