2014-09-26 2 views
1

설명서에서 이해 한대로, 내 매니페스트에 인 텐트 필터를 사용하여 BroadcastReceiver를 등록하면 onReceive 메서드가 호출됩니다. 내 응용 프로그램은 DownloadManager를 사용하여 파일 다운로드를 처리합니다. DOWNLOAD_COMPLETE 동작을 듣고 싶습니다. 그래서, 내 매니페스트에,이 같은 의도 필터가 :인 텐트 필터를 사용하지 않고 BroadcastReceiver를 필터링 할 수 있습니까?

<receiver 
     android:name="com.myapp.DownloadReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
     </intent-filter> 
</receiver> 

내 클래스 메소드는 다음과 같이이다 :

private DownloadManager manager; 
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(result)); 
request.setTitle("MyTitle"); 
request.setDescription("MyDescription"); 
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, Test.txt); 
manager.enqueue(request); 

이 수신기는 DownloadManager에서 보낸 모든 의도를 받게됩니다. 내 애플리케이션에서만 대기열에 포함 된 완료된 다운로드를 수신하여 필터링을 제한 할 수 있습니까? android:exported="false"을 시도하면 DownloadManager 브로드 캐스트가 수신되지 않습니다. 다른 응용 프로그램에서 온 것입니다. ID를 필터링하면 onReceive 메서드가 계속 호출됩니다. 내가 원하는 것은 수신자가 모든 이벤트를 수신하지 못하게하는 것입니다. 감사합니다.

+0

'달성하고자하는 것은 수신자가 모든 이벤트를 수신하지 못하도록하는 것입니다. 수신자는 다운로드 완료 이벤트 만 요구되며, 수신자를 매니페스트에 등록하는 것이 좋습니다. 사용자가 응용 프로그램을 종료 했음에도 불구하고 가능한 빨리 파일을 완성했습니다. – mmlooloo

답변

2

DownloadManager에서 보낸 브로드 캐스트를 필터링 할 수 없습니다. 수신기가 등록되어 있으면 모든 downloadmanager 이벤트에 대한 브로드 캐스트가 수신됩니다.

그러나 DownLoadManager.enqueue 메서드에서 반환 한 ID를 사용할 수 있습니다. 수신기에서는 방송을 트리거 다운로드의 ID를 얻을 수 있습니다 :

Long downLoadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 

이 또한 내가 매니페스트에 수신기를 등록하지 않는 것이 좋습니다를 -이 모든 downloadmanager 이벤트에서 응용 프로그램을 호출합니다, 당신은 아마 그렇게 돼요. 다운로드를 대기열에 추가하고 다운로드가 완료되면 코드를 제거한 후 수신기를 코드에 등록하십시오 (성공했는지 여부). 또한 활동이 파기되기 전에 수신자 등록을 취소하는 것을 잊지 마십시오.

허용되지 않는 경우 (즉, 앱이 활성화되지 않은 상태에서 브로드 캐스트를 수신하려는 경우) 리시버를 매니페스트에 등록하고 필요에 따라이를 켜고 끄십시오. 매니페스트 처음 비활성화 수신기에서

: - :

PackageManager pm = getApplicationContext().getPackageManager(); 
ComponentName componentName = new ComponentName("com.myapp", ".DownloadReceiver"); 
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 

을 그리고 당신은 더 이상 방송을 수신하고 싶지 해달라고하면 다음

<receiver 
     android:name="com.myapp.DownloadReceiver" 
     android:enabled="false" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
     </intent-filter> 
</receiver> 

당신이 그것을 필요로 예를 들어 시작한 후 다운로드가 가능 - 예를 들어 다운로드가 완료되면 수신자 사용 중지 :

pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

이렇게하면 응용 프로그램은 필요할 때만 브로드 캐스트를 수신합니다.

+0

오카, 당신이 말하는 것을 이해하지만 뭔가 잘못되었을 수 있습니다. 당신은 모든 downloadmanager 이벤트를 받았다고 말합니다. 내 매니페스트의 인 텐트 필터를 사용하면 DownloadManager를 사용하는 모든 응용 프로그램에서 필자가 필터링하는 이벤트 만 수신한다는 것을 의미합니까? – Angelo

+0

아마 내 응용 프로그램이 파괴 될 때 수신기를 등록 해제해야합니다. – Angelo

+0

모든 DownloadManager 브로드 캐스트를 수신하고 있습니다. DownloadManager를 사용하는 다른 응용 프로그램에서는 아무 것도받지 않습니다. 그리고 네, 코드에 수신자를 등록 할 때 활동을 파괴하기 전에 등록을 취소해야합니다. Ive는 앱이 활성화되지 않은 경우에도 브로드 캐스트를 수신해야 할 때 어떻게해야하는지 제안을 추가하여 내 답변을 편집했습니다. – Okas

0

내 이해에서 당신은 브로드 캐스트 리시버는, 귀하의 경우에 당신은 the onReceive 메도를 오버라이드 (override) 할 필요가 여기에 당신이 수신 및 브로드 캐스트를 처리하는 곳이다 public class DownloadReceiver extends BroadcastReceiver

해야합니다. 이 사용자의 요구에 맞게 나던 만약 내가

if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) 

죄송 검사 SMS를 수신 내 경우 , 나는 아직 DownloadManager와 함께 일하지 않았습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 이것은 제가 묻고있는 것이 아닙니다. 나는 수신기를 다루는 방법을 안다. 문제는 DownloadManager를 사용하는 다른 응용 프로그램에서 인 텐트를받지 않도록하려는 것입니다. 나는 enqueue 메소드에서 리턴 된 긴 ID를 찾아야한다는 것을 알고 있지만 DownloadManager를 사용하여 파일을 대기열에 넣고 다운로드하는 다른 애플리케이션에서 내 수신기를 트리거하는 것을 피하는 방법이 있는지 묻습니다. – Angelo

+0

유감 스럽지만 이것이 불가능합니다. DownloadManager는 어떤 앱이 다운로드를 시작했는지, 다운로드 한 모든 파일을 모든 앱에서 사용할 수 있는지 추적하지 않으며 신경 쓰지 않습니다. – Okas

관련 문제