Android:在库中注册接收器

Android:在库中注册接收器,android,broadcastreceiver,android-context,Android,Broadcastreceiver,Android Context,我有一个库,其中包括一个名为BaseActivity的活动和一个名为BaseRegister的接收器 BaseRegister扩展了BroadcastReceiver,它的动作是android.net.conn.CONNECTIVITY\u更改了和android.net.wifi.wifi\u STATE\u更改了,看起来像: public class BaseRegister extends BroadcastReceiver { @Override public void o

我有一个库,其中包括一个名为
BaseActivity
的活动和一个名为
BaseRegister
的接收器

BaseRegister
扩展了
BroadcastReceiver
,它的动作是
android.net.conn.CONNECTIVITY\u更改了
android.net.wifi.wifi\u STATE\u更改了
,看起来像:

public class BaseRegister extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if {
            Log.d("onReceive", "Got it"); // Works
            context.sendBroadcast(new Intent("some"));
        else {
            Log.d("onReceive", "Nope"); // Works
            context.sendBroadcast(new Intent("stuff"));
        }
    }
}
根据
Log
,AndroidManifest
也很好。下面是
BaseActivity
的样子:

public class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        registerReceiver(applicationControl, new IntentFilter("some"));
        registerReceiver(applicationControl, new IntentFilter("stuff"));
    }

    private BroadcastReceiver applicationControl = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.equals(new Intent("some"))) {
                some();
            } else if (intent.equals(new Intent("stuff"))) {
                stuff();
            }
        }
    };

    public void some() { /** logging etc **/ }
    public void stuff() { /** logging etc **/ }


}
在project中,我已经将此项目添加为库,没有问题。并创建了一个扩展
BaseActivity
的活动。当
CONNECTIVITY\u作为一个动作改变时,
BaseRegister
由Android触发,但不需要活动。以下是我的项目的外观:

public class AnyActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
}

    @Override
    public void some() {
        super.some();
        Log.d("abc", "abc"); // not working
    }


    @Override
    public void stuff() {
        super.stuff(); 
        Log.d("abc", "abc"); //not working
    }

}

怎么了?我的方法是否不当或存在任何错误?任何帮助都很好。

BaseActivity将调用范围内“最近”的方法,这是正常的核心Java行为,并非Android独有。如果您确实希望将BroadcastReceiver保留在基类中并向子类发送信号,那么您将需要类似于自定义侦听器的东西,即子类在运行时注册,并且当事件到达时将通知它们

此外,当活动不是堆栈顶部时禁用广播接收器被认为是一种良好的做法,因此您可能希望在onResume()/onPause()中使用registerReceiver()/unregisterReceiver()


祝你好运。

为什么不在你的AndroidManifest中注册BroadcastReceiver?像这样:

    <receiver android:name=".BaseRegister">
        <intent-filter>
            <action android:name="some" />
            <action android:name="stuff" />
        </intent-filter>
    </receiver>


当您收到广播时,您的
任何活动都处于活动状态吗。这实际上是我的问题。你是对的,如果我在儿童中注册,那就行了。所以没有办法在基类中注册。自定义侦听器呢?你能举个例子吗?你可以把BroadcastReceiver放在基类中,真正的问题是你现在不能给孩子们发信号。如何将register(Activity me)方法添加到您的基础中?在方法中保留一个子活动的ArrayList,事件到达时将调用该子活动。FWIW,除了重复的代码外,每个活动都有自己的广播接收器,这并没有任何真正的危害。