学习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出来的,所以可以这么做
- 在activity中创建一个静态类成员变量 instance
- 在onCreate方法的最后,将this赋值给instance
- 自己写一个静态方法getInstance
- 在广播中得到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();
}
});
}
}
}