1

Android의 DownloadManager를 사용하여 파일을 다운로드하기 위해 IntentService을 만들었습니다.IntentService의 registerReceiver가 BroadcastReceiver에 맞지 않습니다.

 <service 
      android:name=".services.DownloadService" 
      android:enabled="true" > 
     </service> 

BroadcastReceiver(function()) 내부의 코드는 결코 파일이 다운로드되는 경우에도 실행되지 않은 : 나는 매니페스트에서이 항목을했습니다

public class DownloadService extends IntentService { 

    public DownloadService() { 
     super("name"); 
    } 

    BroadcastReceiver onComplete = new BroadcastReceiver() { 
     public void onReceive(Context ctxt, Intent intent) { 
      function(); 
     } 
     }; 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
     Utility.download(someURL); 

     } 

    } 

: 다음은 내 클래스입니다. 나는 또한 IntentService 대신 Service에서 같은 일을 시도했다. IntentService에서 BroadcastReceiver 작업을 수행하려면 어떻게해야합니까?

+0

브로드 캐스트 리시버를 프로그래밍 방식으로 설정하는 대신 Android 매니페스트에 등록해야한다고 생각합니다. 시스템에서 애플리케이션이 DownloadManager.ACTION_DOWNLOAD_COMPLETE 인 텐트를 처리 할 수 ​​있어야 함을 알고 있어야합니다. – Entreco

+0

http://stackoverflow.com/questions/26754302/registerreceiver-inside-intentservice-tracking-smsmanager –

답변

1

IntentService의 컨텍스트를 사용하여 registerReceiver 메서드를 호출하지 않도록하십시오.

IntentService#onHandleIntent 메서드가 반환되면 Service#stopSelf(int) 메서드가 호출됩니다. 아직 등록되지 않은 모든 수신자는 유출 된 것으로 간주됩니다. 프레임 워크는 심지어 그것에 대해 경고합니다 :

E/ActivityThread﹕ Service com.your.packagename.YourIntentService has leaked IntentReceiver com.your.package[email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
    android.app.IntentReceiverLeaked: Service com.your.packagename.YourIntentService has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:796) 
    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:597) 
    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1438) 
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1418) 
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1412) 
    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467) 
    at com.your.packagename.YourIntentService.onHandleIntent(YourIntentService.java:79) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 

물론 누출 된 브로드 캐스트 리시버는 알림을 수신하지 않습니다.

브로드 캐스트 리시버를 IntentService#onHandleIntent 방법으로 등록하려면 해당 응용 프로그램의 컨텍스트를 사용하십시오.

getApplication().registerReceiver(receiverInstance, 
     new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

그러나 완료하면 각 수신기 인스턴스를 등록 취소하는 논리를 추가해야합니다.

+0

등록 된 리시버를 트리거하려면 어떻게할까요? 응용 프로그램이 닫힌 후에도 getApplication 컨텍스트를 사용하면 트리거되지 않습니다. –

+0

@AraYeressian 리시버를 매니페스트에 선언하고 http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting%28android.content.ComponentName을 사용하여 논리에 따라 사용/사용 중지 할 수 있습니다. % 20int, % 20int % 29 –