2012-10-09 2 views
2

나는 정기 알람과 IntentService를 사용하여 웹 사이트의 데이터를 주기적으로 검색하는 앱을 구축하고 있습니다. 업데이트를 실행하기 전에 ConnectivityManager로 네트워크 연결을 확인합니다.네트워크 통신을 재 시도하는 올바른 방법

ConnectivityManager에서 활성 네트워크가 없다고보고하면 네트워크가 활성화 될 때 다시 업데이트를 시도하고 싶습니다. ConnectivityManager.CONNECTIVITY_ACTION을 수신하는 BroadcastReceiver를 사용하는 것이 가장 좋은 방법 인 것처럼 보이지만이 수신기를 등록/등록 취소하는 적절한 방법은 무엇입니까?

IntentService에서 네트워크 검사가 실패하면 BroadcastReceiver를 ApplicationContext에 등록하여 서비스가 중지 될 때 등록이 해제되지 않는다고 생각합니다. 그런 다음 수신자가 수신시 자체 수신 방법에서 등록을 취소 할 수 있습니까? 나는 기지에서 벗어나나요?

일부 사이비 코드 예제 :

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

나는 내 문제에 대한 해결책을 발견했다 생각합니다. 수신자를 ApplicationContext에 등록하는 것은 앱 프로세스가 종료 될 때 등록되지 않기 때문에 작동하지 않습니다.

이 문제를 처리하는 적절한 방법은 Manifest에 수신기를 선언 한 다음 PackageManager.setComponentEnabledSetting을 사용하여 수신기를 필요에 따라 활성화/비활성화하는 것입니다 (위의 두 예 대신).

그래서, 매니페스트에 등록 할 비활성화로 (= 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); 
+0

이것을 테스트하고 작동하는 것처럼 보입니다. – Ralgha

관련 문제