Android广播接收器,没有收到?

时间:2014-05-21 14:20:49

标签: android broadcastreceiver

我的BroadcastReceiver没有被解雇的问题。这是接收者的定义:

    public class UIUpdater extends BroadcastReceiver {
        private final Handler handler;
        public UIUpdater(Handler handler)
        {
            this.handler = handler;
        }

        @Override
        public void onReceive(final Context context, final Intent intent)
        {           
            String action = intent.getAction();
            Log.i("MAIN", " >>> ACTION <<< : " + action);

            if(action.equalsIgnoreCase("PROGRESSINIT"))
            {
                int size = intent.getIntExtra("PROGRESSSIZE", 0);
                updatePopulateProgressSize(size);
            }

            handler.post(new Runnable(){
                @Override
                public void run(){
                    updatePopulateProgress(intent.getIntExtra("PROGRESS", 0));                  
                }
            });
        }
    }

这里是 Manifest

    <receiver android:name="com.goosesys.gaggle.Main$UIUpdater">
        <intent-filter>
            <action android:name="com.goosesys.gaggle.populate"/>
        </intent-filter>
    </receiver>

在这里我试图使用它:

    JSONArray array = new JSONArray(xmppBack.getPayload());

    Intent intent = new Intent(Constants.BC_POPULATE);
    intent.setAction(Constants.BC_PROGRESSINIT);
    intent.putExtra(Constants.BC_PROGRESSSIZE, array.length());
    GaggleApplication.getContext().sendBroadcast(intent);

哦,常数:

public static final String BC_POPULATE              = "com.goosesys.gaggle.populate";
public static final String BC_PROGRESSINIT          = "PROGRESSINIT";
public static final String BC_PROGRESSSIZE          = "PROGRESSSIZE";
public static final String BC_PROGRESSINC           = "PROGRESSINC";

事情是,我已经逐步完成了每个部分,一切都很好,没有错误,没有泄漏,没有问题。只是onReceive永远不会弹出:(

我是广播接收者的新手,请保持温和;)

提前干杯!

2 个答案:

答案 0 :(得分:3)

如果你看过LogCat,你会发现一个警告或错误,堆栈跟踪抱怨Android无法创建UIUpdater的实例。这有两个原因:

  1. 它不是static内部类,因此框架无法创建它的实例(实例只能由外部Main类实例创建)

    < / LI>
  2. 它没有零参数构造函数,而且框架将使用什么

  3. 此外,对于像这样的常规系统广播,这不是一个很好的用例。请使用进程中的事件总线(LocalBroadcastManager,Square&#t,Otto,greenrobot的EventBus等)。这将提高性能(无IPC),提高安全性(目前,任何人都可以破解您的接收器),并可能简化您的代码(如果您使用Otto或EventBus)。

答案 1 :(得分:0)

您需要在某处注册您的接收器。通常在onCreate方法中,我这样做:

registerReceiver(new UIUpdater(mhandler), new IntentFilter());