2

我正在构建一个应用程序,该应用程序使用重复警报和 IntentService 定期从网站检索数据。在运行更新之前,我使用 ConnectivityManager 检查网络连接。

如果 ConnectivityManager 报告没有活动网络,我希望在网络变为活动状态时再次尝试更新。使用 BroadcastReceiver 监听 Co​​nnectivityManager.CONNECTIVITY_ACTION 似乎是最好的方法,但是注册/注销此接收器的正确方法是什么?

我在想,当 IntentService 中的网络检查失败时,我可以使用 ApplicationContext 注册 BroadcastReceiver,这样当服务停止时它就不会被取消注册。然后我可以在接收器触发时在它自己的 onReceive 方法中取消注册接收器吗?我离基地很远吗?

一些伪代码示例:

我的意图服务:

if ( !isNetworkConnected() )
    getApplicationContext().registerReceiver( new MyBroadcastReceiver(), new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION );

我的广播接收器:

public void onReceive( Context context, Intent intent ) {
    context.getApplicationContext().unregisterReceiver( this );
4

1 回答 1

1

我相信我已经找到了解决问题的方法。使用 ApplicationContext 注册接收器将不起作用,因为当应用进程终止时它将被取消注册。

我相信处理这个问题的正确方法是在清单中声明接收器,然后根据需要使用 PackageManager.setComponentEnabledSetting 启用/禁用接收器(代替我上面的两个示例)。

所以,我会在 Manifest 中将其注册为禁用(启用 = false),然后执行以下操作:

我的意图服务:

protected void onHandleIntent( Intent intent ) {
    if ( !isNetworkConnected() )
        getPackageManager().setComponentEnabledSetting(
            new ComponentName( this, MyBroadcastReceiver.class ),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP );

我的广播接收器:

public void onReceive( Context context, Intent intent ) {
    getPackageManager().setComponentEnabledSetting(
        new ComponentName( this, MyBroadcastReceiver.class ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP );
于 2012-10-13T00:18:57.830 回答