4

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

这是我当前的接收器:

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 后无法执行此操作

4

2 回答 2

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

然后在每个Activity的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. 但这是主要思想,您可以修改它。

于 2013-01-17T21:30:16.900 回答
0

我在 onReceive 方法中做了这样的事情:

    if (context instanceof LoginActivity) {
        switchLoginFields((LoginActivity) context, isConnected);
    } else if (context instanceof ReceiptActivity || context instanceof AmountActivity) {
        showArelt(context, isConnected);
    }
于 2013-01-17T21:17:56.197 回答