Активность Android не транслируется с местного сервиса - PullRequest
2 голосов
/ 13 ноября 2011

Из примеров это выглядело просто.Может быть, вы можете показать мне, что я сделал не так.Я не могу получить действие для получения широковещательной рассылки, отправленной из локальной службы.

У меня есть Activity1, которая запускает Service1:

startService(new Intent(Activity1.this, Service1.class));

Activity1, затем запускает Activity2:

startActivity(new Intent(Activity1.this, Activity2.class));

Service1, локальная служба, прослушивает загрузки:

protected final BroadcastReceiver service2DownloadBroadcastReceiver = new BroadcastReceiver()
{
    public void onReceive(final Context context, final Intent intent)
    {
        ...
        broadcastDownloadFinished(Uri.fromFile(downloadedFile));

Затем широковещательный получатель Service1 передает свое собственное сообщение:

protected Intent broadcastDownloadFinished(final Uri uri)
{
    final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
    sendBroadcast(intent);

Activity2, которое находится на переднем плане ввремя прослушивает намерение ACTION_DOWNLOAD_FINISHED, используя собственный широковещательный приемник:

private final BroadcastReceiver activity2DownloadBroadcastReceiver = new BroadcastReceiver()
{
    public void onReceive(final Context context, final Intent intent)
    {
        Log.i(Activity2.class.getSimpleName(), "Received download event: " + intent.getAction() + " " + intent.getData());

Activity2, конечно, регистрирует получателя:

protected void onResume()
{
    super.onResume();
    final IntentFilter downloadIntentFilter = new IntentFilter();
    downloadIntentFilter.addAction(ACTION_DOWNLOAD_FINISHED);
    registerReceiver(activity2DownloadBroadcastReceiver, downloadIntentFilter);

В случае, если это имеет значение, ACTION_DOWNLOAD_FINISHED это что-то вроде"com.example.intent.action.DOWNLOAD_FINISHED".

Служба 1 получает событие диспетчера загрузки в своем приемнике и, по-видимому, транслирует свое собственное пользовательское событие, но активность 2, похоже, никогда не получает его.Что я сделал не так?Это проблема для передачи намерения в середине обработки другого?(Я бы так не подумал - это асинхронно, верно?)

Обновление: Просто чтобы убедиться, что нет проблем с отправкой трансляции в середине приема трансляции,Я изменил свой широковещательный код, чтобы фактически выполнить трансляцию через три секунды в главном потоке:

    Log.i(getClass().getSimpleName(), "...ready to broadcast");     
    final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
    mainThreadHandler.postDelayed(new Runnable()
    {
        public void run()
        {
            Log.i(getClass().getSimpleName(), "...broadcasting");
            sendBroadcast(intent);
            Log.i(getClass().getSimpleName(), "...broadcasted");                
        }
    }, 3000);
    Log.i(getClass().getSimpleName(), "...scheduled to broadcast");

Как и ожидалось, в журнале говорится:

...ready to broadcast
...scheduled to broadcast
...broadcasting
...broadcasted

Пока ничего не получено в действии,Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Эврика! Я нашел это! Проблема в том, что я поставил URI данных в своем намерении вещания. Правила соответствия намерений Android немного усложняются. Если вы предоставляете URI данных, тогда ваш фильтр намерений должен указать соответствующий тип MIME.

К сожалению, хотя в документации Android говорится, что тип данных может быть выведен из URI данных, очевидно, Android не знает, что file://.../example.jpg является изображением. Так что это не работает:

intentFilter.addDataType("image/*");

Однако вместо указания типа я могу указать схему, которую я принимаю:

intentFilter.addDataScheme("file");

Это работает! Это немного грубо - и немного искусственно, чтобы ограничить мои трансляции file: URI, но так как это все, что я сейчас использую, это работает.

Обратите внимание, что, очевидно, я мог вручную указать тип MIME в намерении при его трансляции, но сейчас это слишком сложно, поскольку я загружаю изображения из Picasa, поэтому я уже знаю, что они являются изображениями (и не заботиться о конкретном типе MIME). И если это доставит слишком много хлопот, я мог бы полностью отказаться от всего этого setData() и установить дополнительный - но, конечно, я хочу сделать все правильно.

0 голосов
/ 13 ноября 2011

Вы включили своего получателя в манифест своей деятельности?

<receiver
  android:name=".YourReceiver">
  <intent-filter>
    <action
      android:name="intent_name"></action>
  </intent-filter>
</receiver>
...