Android:在库中注册接收器

5

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

BaseRegister扩展了BroadcastReceiver,其操作是android.net.conn.CONNECTIVITY_CHANGEandroid.net.wifi.WIFI_STATE_CHANGED,它看起来像这样:

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

AndroidManifest 也可以,根据 Log 的说法。下面是 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 **/ }


}

在项目中,我已经将此项目添加为库,没有问题。并创建了一个扩展BaseActivity的活动。当CONNECTIVITY_CHANGE作为操作时,Android触发BaseRegister,但活动没有调用。以下是我的项目外观:
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
    }

}

有什么问题吗?我的方法不当还是存在错误?任何帮助都将不胜感激。

你的 AnyActivity 在接收到广播时是处于活动状态吗? - Gopal Gopi
不,那正是我的问题。 - Ogulcan Orhan
2个回答

1

BaseActivity会在范围内调用"closest"方法,这是正常的Java核心行为,不仅适用于Android。如果您确实想将BroadcastReceiver保留在基类中并向子类发出信号,则需要类似于自定义监听器的东西,即子类在运行时注册,当事件到达时,它们将被通知。

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

祝您好运。


你说得对,如果我在子类中注册,那就可以了。所以没有办法在基类中注册。那自定义监听器呢?你能给出任何问答示例吗? - Ogulcan Orhan
1
你可以将BroadcastReceiver保留在基类中,真正的问题是目前无法向子类发出信号。那么,在基类中添加一个register(Activity me)方法怎么样?在该方法中,保留一个子Activity的ArrayList,当事件到达时,您将调用它们作为事件。顺便说一下,每个Activity拥有自己的BroadcastReceiver除了重复代码外并没有任何实际伤害。 - guycole

0
为什么不在AndroidManifest中注册BroadcastReceiver呢?像这样:
    <receiver android:name=".BaseRegister">
        <intent-filter>
            <action android:name="some" />
            <action android:name="stuff" />
        </intent-filter>
    </receiver>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接