广播接收器即使在app被用户杀死后仍然工作

时间:2017-03-29 23:44:07

标签: java android android-studio service broadcastreceiver

我有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()的每项活动中注册?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

这怎么可能?

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

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

  

一旦应用程序被杀,我有办法取消注册我的广播接收器吗?

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

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

  • 如果某个特定服务正在运行,请使用服务onStop()中的registerReceiver()onCreate()中的unregisterReceiver()