繁体   English   中英

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

[英]Broadcast receiver working even after app is killed by user

我有一个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()中注册它?

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

这怎么可能?

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

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

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

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

  • 如果某个特定活动位于前台,请使用registerReceiver()而不是清单,在活动的onStart()方法中注册广播并在onStop()取消注册

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM