Android - LocalBroadcast

时间:2015-09-01 12:08:07

标签: java android

我搜索了很多,但未找到解决以下问题的方法。

背景:

  • 我使用AsyncHttpResponseHandler对象来处理我的所有web服务 回应
  • 如果我从WS获得特定的错误代码,我想显示一个警告对话框(无论当前显示的活动是什么)
  • 我开始认为使用LocalBroadcastManager是一个很好的解决方案,因为HTTP处理程序不知道当前显示的活动

问题: 在实现了使其工作所需的所有内容之后,我没有收到从异步处理程序发送的意图。

附加说明:

  • ApplicationContext存储在我的StaticItems中 包含我在app中需要的所有静态数据的类。它是通过继承自Application的自定义类设置的
  • 如果我从活动广播意图,则会触发OnReceive事件

我提前感谢您提供的任何帮助。

干杯!

以下是我的一些代码:

http处理程序中的代码

public class AsyncResponseHandler extends AsyncHttpResponseHandler {
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        if(response != null && response.length > 0) {
            CrvData data = JsonHelper.getCrvData(new String(response));
            String code = data.getErrorCode();
            if (!TextUtils.isEmpty(code) && code.equals(StaticItems.C_WS_OBSOLETE_VERSION_ERROR)) {
                Intent intent = new Intent();
                intent.setAction(StaticItems.BROADCAST_INTENT_MESSAGE);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse(data.getValue()));
            LocalBroadcastManager.getInstance(StaticItems.applicationContext).sendBroadcast(intent);
        }
    }
}

我用于所有活动的根活动的代码

public class MainActivity extends Activity {

    /**
     * The local broadcast receiver
     */
    protected MyBroadcastReceiver mMessageReceiver = new MyBroadcastReceiver();

    @Override
    protected void onResume() {
        super.onResume();
        // register
        IntentFilter filter = new IntentFilter();
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        filter.addAction(StaticItems.BROADCAST_INTENT_MESSAGE);
        LocalBroadcastManager.getInstance(StaticItems.applicationContext).registerReceiver(mMessageReceiver, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Unregister
        LocalBroadcastManager.getInstance(StaticItems.applicationContext).unregisterReceiver(mMessageReceiver);
    }
}

接收器

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setInverseBackgroundForced(true)
                .setNegativeButton(context.getResources().getString(R.string.dlg_no), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setIcon(R.drawable.ic_dialog_alert_holo_light)
                .setMessage(R.string.dlg_app_is_obsolete)
                .setPositiveButton(context.getResources().getString(R.string.dlg_yes), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        context.startActivity(intent);
                    }
                });
        builder.show();
    }
}

4 个答案:

答案 0 :(得分:1)

我有一个类似的问题,由于某种原因,你不能通过LocalBroadcastManager返回Intent setData(..),当我把我的URI放在额外的数据中时,它开始工作......可能是一个bug?

答案 1 :(得分:0)

我的猜测是您使用的context不是活动上下文,因此无法用于创建对话框。

即,在这种情况下传递给onReceive的上下文应该是您的应用程序上下文StaticItems.applicationContext 不适合显示对话框。

如果是这种情况,您应该以某种方式重新安排代码,以确保传递活动上下文而不是应用程序。

答案 2 :(得分:0)

addCategory()

中删除IntentFilter

已解决here

答案 3 :(得分:0)

好的......我发现因为这条线没有收到意图: intent.setData(Uri.parse(data.getValue()));

正如@mvai指出的那样,无法从应用程序上下文中显示对话框。我设法通过在我的应用程序类中引用它来获取当前活动。 (我检查确定没有任何内存泄漏)