【问题标题】:Broadcast receiver working even after app is killed by user即使在应用程序被用户杀死后广播接收器也能正常工作
【发布时间】:2017-03-29 23:44:07
【问题描述】:

我有一个BroadcastReceiver 检查静态声明为的网络连接:

<receiver
            android:name=".core.util.NetworkChangeReceiver"
            android:label="NetworkChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>

网络更改接收器执行以下操作:

public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {

    String status = NetworkUtil.getConnectivityStatusString(context);

    if(status == "Not connected to Internet") {
        Intent i = new Intent(context, Dialog.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

}

问题是当我手动终止我的应用程序并关闭网络(飞行模式)时,对话活动启动。这怎么可能?我的广播接收器在后台还活着吗?

问题:

一旦应用程序被杀死,我有没有办法取消注册我的广播接收器?也许在Android的应用程序单例类中?

如果在 Application 类中不可能,我是否必须在 onStop() 的任何地方手动取消注册它?并在每个活动中注册onStart()?

【问题讨论】:

    标签: java android android-studio service broadcastreceiver


    【解决方案1】:

    您希望在每个活动中注册和取消注册BroadcastReceiver。 我认为application 类是最好的解决方案。 Application 类中有一个名为 registerActivityLifecycleCallbacks() 的函数, 您可以实时观看您的活动生命周期回调。

    【讨论】:

    • 嗨 :) 那么您是否建议每次活动都会一次又一次地调用此回调?此外,当我的应用程序中的每个活动都调用 onstop 或 ondestroy unregister 时会被调用吗?
    • @Ackman:是的,回调会被一次又一次地调用,但是你可以控制你的代码流逻辑。例如,你的应用程序在 onActivityStarted() 被调用时创建计数器,如果计数器等于 1 ,注册广播接收器;在调用 onActivityStoped() 时减少您的计数器,如果计数器等于 0,则注销广播接收器。你明白吗?可能是一个代码演示看起来更有帮助。 ^_^
    【解决方案2】:

    这怎么可能?

    您在清单中注册了广播。如果发送了匹配的广播,您的应用程序将做出响应。如果需要,如果您的应用当时没有运行,Android 会为您创建一个进程。

    (至少在 Android O 发布之前,但这是另一个故事)

    有没有办法在应用程序被终止后取消注册我的广播接收器?

    您需要确定接收此广播的时间段:

    • 如果某个特定活动在前台,则使用registerReceiver() 代替清单,在活动的onStart() 方法中注册广播并在onStop() 中取消注册

      李>
    • 如果是在某个特定服务运行时,请在服务的onCreate() 中使用registerReceiver(),在onDestroy() 中使用unregisterReceiver()

    【讨论】:

    • 好的,如果我启动一项服务并在该服务中注册和注销我的广播接收器。一旦我的应用被手动终止,服务会停止或终止吗?
    • 换句话说,android中服务的生命周期是多少?我是否只需要在应用程序的任何位置启动它一次,它就会继续存在,除非应用程序被杀死?
    • @Ackman:在某种程度上,you control the lifetime of the service。但是,这有点次要。你创建了你的NetworkChangeReceiver。为什么?这个接收器有什么意义?这个接收者应该做什么的业务规则是什么?您需要确定所需的应用功能,然后决定应该使用哪些组件,以及应该如何使用它们。
    • 基本想法是,每当我的网络发生变化时,即 wifi 关闭或蜂窝信号消失。一个新的活动“服务不可用”被调用。我认为在每个活动上注册和注销广播接收器将是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多