Search code examples
androidandroid-manifestandroid-download-manager

Receiver for DownloadManager.ACTION_DOWNLOAD_COMPLETE in Manifest


Is it possible to listen for DownloadManager.ACTION_DOWNLOAD_COMPLETE in Manifest.xml?

All the examples I found use registerReceiver(downloadCompleteReceiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); from a class but I would like to receive it in Manifest.xml so I can listen when the app is closed. I can't find this action when I try to set the intent-filter for my receiver in Manifest.xml


Solution

  • As the official documentation states:

    Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers.

    If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a context-registered receiver when the user is actively using your app.

    From Is android.intent.action.DOWNLOAD_COMPLETE an explicit broadcast? we learn that android.intent.action.DOWNLOAD_COMPLETE seems to be an explicit broadcast, therefore there should be no issue defining a <receiver> for it in the manifest, even if it's not autocompleted. So just add it with an action of android.intent.action.DOWNLOAD_COMPLETE.

    <receiver 
        android:name=".your.DownloadCompleteReceiver"
        android:permission="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS"
        android:exported="true">
      <intent-filter>
         <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
      </intent-filter>
    </receiver>