如何在广播接收者(BroadcastReceiver)中刷新UI

本文介绍了如何在Android的广播接收者中更新UI的方法。通过使用Handler或者runOnUiThread方法,并解决了MainActivity.this.runOnUiThread导致的问题,实现了在发送短信后更新进度条的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习android小伙伴今天问了一个大家都可能遇到的问题,打算在自己写的广播接收者里面更新ui,说白了,就是打算干这样一个事: 发送短信,发送完了之后打算在界面显示一个进度圈,在对方收到短信之后就取消显示。

这个问题,如果把进度条改成土司相信大家都会,直接在onReceive 中判断一下即可

if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
            if (getResultCode() == -1) {
                Toast.makeText(context, "发送成功", 1).show();
            } else if (getResultCode() == 0) {
                Toast.makeText(context, "发送失败", 1).show();
            }
        }

但我们想做的不仅仅是土司,那可怎么办呢,有同学想到了安卓中的消息传递机制,也就是Handler,不错,这个可行。还有呢,那就是runOnUiThread 这个方法。

如果直接使用,MainActivity.this.runOnUiThread 会导致""No enclosing instance of the type MainActivity is accessible in scope" " 个问题,这是因为MainActivity 并不是内部类,怎么解决呢?我们现在想要在广播中得到activity的上下文,这是这个问题的关键!,由于activity不是我们new出来的,所以可以这么做

  1. 在activity中创建一个静态类成员变量 instance
  2. 在onCreate方法的最后,将this赋值给instance
  3. 自己写一个静态方法getInstance
  4. 在广播中得到activity的上下文即可
if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
            if (getResultCode() == -1) {
                // Toast.makeText(context, "发送成功", 1).show();
                MessSendActivity.getInstance().runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        // Toast.makeText(MessSendActivity.getInstance(),
                        // "from messSend", 1).show();
                        ProgressBar pb = (ProgressBar) MessSendActivity
                                .getInstance().findViewById(R.id.pb);
                        pb.setVisibility(View.INVISIBLE);
                    }
                });
            } else if (getResultCode() == 0) {
                Toast.makeText(context, "发送失败", 1).show();
            }
        }

附:如果使用内部类,通过代码注册广播接受者,可以这样实现:

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();
                }
            });
        }
    }
}

参考:广播接收者更新UI

参考:通过静态方法展示一个dialog

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值