我正在构建一个应用程序,它定期使用定期警报和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 );
答案 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 );