在BroadcastReceiver()中检索调用上下文

时间:2013-01-17 21:14:28

标签: java android broadcastreceiver android-alertdialog android-context

我正在尝试从广播接收器显示警告对话框片段但接收器不在将显示片段的活动中(接收器处理在此事件上广播的所有错误,无论它是否是活动活动)。

这是我现在的接收者:

private BroadcastReceiver mHttpPostReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) { 
              if (intent.getStringExtra("Error") != null) { // error occurred
                      // called from a fragment in another activity
                      NetworkError.show(((Activity) context).getFragmentManager(), error);
               }
      }
};        

但是函数中的context参数是它所处活动的当前上下文,并导致运行时非法状态异常,因为此活动不在屏幕上。有没有办法通过广播发送调用函数的上下文?或者我还有另一种方法可以实现吗?

我目前得到的具体错误是:

  

java.lang.IllegalStateException:onSaveInstanceState之后无法执行此操作

2 个答案:

答案 0 :(得分:1)

您应该添加额外内容,说明您正在广播的Activity中调用Intent,然后根据此内容写入SharedPreferences之类的内容。然后在Activity的onResume()中,检查首选项的键是否包含消息,然后更新UI。

例如

@Override
public void onReceive(Context context, Intent intent) { 
  if (intent.getStringExtra("Error") != null) { 
    String callingActivity = intent.getStringExtra ("CallingActivity");
    if (callingActivity != null);
    context.getSharedPreferences (callingActivity, Context.MODE_PRIVATE).edit().putString ("errorMessage", "You have an error").commit();
  }
}

然后在每个活动的onResume()

@Override
 protected void onResume()
{
  super.onResume();
  String errorMsg =context.getSharedPreferences ("ThisActivityName", Context.MODE_PRIVATE).getString ("error");
  if (errorMsg.equals ("You have an error")){
    //update fragment code here.  
    //set SharedPreference errorMessage key to hold something else.
  } 
}

我拥有它的方式,每个Activity都有自己的SharedPreferences数据库,数据库名称与callingActivity同名。这意味着当您从onResume()读入时,"ThisActivityName"应与callingActivity相同。但这是主要的想法,你可以修改它。

答案 1 :(得分:0)

我在onReceive方法中做了类似的事情:

    if (context instanceof LoginActivity) {
        switchLoginFields((LoginActivity) context, isConnected);
    } else if (context instanceof ReceiptActivity || context instanceof AmountActivity) {
        showArelt(context, isConnected);
    }