重用网络通信的正确方法

时间:2012-10-09 01:26:56

标签: android

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

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

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

一些伪代码示例:

MyIntentService:

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

MyBroadcastReceiver:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

MyIntentService:

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

MyBroadcastReceiver:

public void onReceive( Context context, Intent intent ) {
    getPackageManager().setComponentEnabledSetting(
        new ComponentName( this, MyBroadcastReceiver.class ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP );