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, поскольку они поступают из другого приложения. Если я фильтрую идентификаторы, мой метод onReceive по-прежнему вызывается. Я хочу добиться того, чтобы мой получатель получал ВСЕ события. Спасибо!

+0

'Что я хочу достичь, так это избежать того, что мой получатель получит ВСЕ события. Ваш приемник вызван только для загрузки полных событий, и я думаю, что это хорошая идея зарегистрировать ваш приемник в манифесте, потому что вы можете обработать свой как можно скорее, если пользователь закрыл ваше приложение. – mmlooloo

ответ

2

Вы не можете фильтровать широковещательные передачи, отправленные вам DownloadManager - пока ваш ресивер зарегистрирован, вы будете получать трансляции для всех событий downloadmanager.

Однако вы можете использовать id, возвращаемый методом DownLoadManager.enqueue. В ресивере вы можете получить идентификатор загрузки, инициировавшего трансляции:

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

Кроме того, я не рекомендую, чтобы зарегистрировать свой приемник в манифесте - это будет вызывать приложение на ВСЕХ downloadmanager событий, вы, вероятно, не хотят. Вместо этого зарегистрируйте приемник в коде после того, как вы внесете в очередь вашу загрузку и удалите ее, когда ваша загрузка закончена (успешно или нет). Также не забудьте отменить регистрацию приемника до того, как ваша деятельность будет уничтожена.

Если это неприемлемо, т. Е. Вы иногда хотите получать трансляции, когда ваше приложение неактивно, вы должны зарегистрировать приемник в манифесте и включить его/выключить по мере необходимости.

В вашем манифесте первоначально отключить приемник:

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

Тогда, когда вам это нужно - например, после начала загрузки включить его:

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

И когда вы больше не не хотите принимать широковещательные - например, когда ваша загрузка завершена, отключите приемник:

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

Таким образом ваше приложение будет получать трансляции только в случае необходимости.

+0

Окас, я понимаю, о чем вы говорите, но, возможно, что-то не так. Вы говорите, что я получаю ВСЕ события downloadmanager. Вы имеете в виду, что с фильтрами намерений в моем манифесте я получаю только события, которые я фильтрую из ВСЕХ приложений, которые используют DownloadManager, не так ли? – Angelo

+0

Возможно, мне нужно отменить регистрацию моего приемника, когда мое приложение будет уничтожено. – Angelo

+0

Вы получаете все трансляции DownloadManager. Вы не получите ничего от других приложений, использующих DownloadManager. И да, когда вы регистрируете получателя в коде, вы должны отменить регистрацию до того, как ваша деятельность будет уничтожена. Ive отредактировал мой ответ, добавив, что делать, когда вам иногда нужно получать трансляции, даже когда ваше приложение неактивно. – Okas

0

В моем понимании вам нужен BroadcastReceiver, в вашем случае это должно быть public class DownloadReceiver extends BroadcastReceiver

Вы должны переопределить the onReceive METHODE и здесь вы принимать и обрабатывать трансляцию. В моем случае для получения SMS я проверил на

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

Извините, если это не приспосабливает ваши потребности, я не работал с DownloadManager еще.

+0

Спасибо за ваш ответ, но это не то, о чем я прошу. Я знаю, как обращаться с приемниками. Проблема в том, что я хочу избежать получения намерений от других приложений, которые используют DownloadManager. Я знаю, что я должен искать длинные идентификаторы, возвращаемые методом enqueue, но я спрашиваю, есть ли способ избежать запуска моего приемника из других приложений с помощью DownloadManager для размещения и загрузки файлов. – Angelo

+0

К сожалению, это невозможно, DownloadManager не отслеживает и не заботится о том, какое приложение загрузилось, и все загруженные файлы доступны для всех приложений. – Okas

Смежные вопросы