Действие фильтра намерений и правильное отображение уведомлений

#android

#Android

Вопрос:

Я пишу приложение для совместного использования медиафайлов.

Теперь он разделен на 2 части:

 <application&&t;
        <activity android:name="FileUploader"
                  android:label="..."
                  &&t;
            <intent-filter&&t;
                <action android:name="android.intent.action.SEND"/&&t;
                <data android:mimeType="*/*"/&&t;
                <cate&ory android:name="android.intent.cate&ory.DEFAULT"/&&t;
            </intent-filter&&t;
        </activity&&t;

    <service android:name=".FileUploaderService" /&&t;


    </application&&t;
  

FileUploader — это действие, которое следует запускать из других действий (например. Галерея или камера).
FileUploaderService — это сервис, который фактически загружает файл на HTTP-сервер. Он выполняет несколько HTTP-запросов.

Теперь возможно, что пользователь нажимает кнопку «Домой» во время загрузки и возвращается на главный экран. В этом случае я хочу иметь уведомление с информацией о текущем этапе загрузки, которое вернет пользователя к активности при нажатии.

Я создал это следующим образом:

     int icon = R.drawable.icon;
    CharSequence tickerText = "Uploadin& File";
    lon& when = System.currentTimeMillis();

    Notification notification = new Notification(icon, tickerText, when);

    Context context = &etApplicationContext();
    CharSequence contentTitle = "Uploadin& File";
    CharSequence contentText = "Upload in pro&ress. Sta&e #"   i;

    Intent notificationIntent = new Intent(this, FileUploader.class);
    Pendin&Intent contentIntent = Pendin&Intent.&etActivity(this, 0,
            notificationIntent, 0);

    notification.fla&s |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(context, contentTitle, contentText,
            contentIntent);

    mNM.notify(R.layout.main, notification);
  

Проблема в том, что когда я нажимаю кнопку «Домой» во время загрузки — экземпляр активности FileUploader, который был запущен из галереи, становится «остановленным», а когда я нажимаю уведомление — запускается второй экземпляр активности FileUploader.

Итак, есть ли какой-нибудь способ «вернуться» к первому действию при нажатии на уведомление вместо запуска нового?

Я пробовал следующие способы, но ни один из них здесь не работает:

  1. вызовите finish() в методе FileUploader.onStop() — действие закрывается при переключении с книжной ориентации на альбомную.

  2. установите android:launchMode=»sin&leTask» для действия FileUploader в AndroidManifest.xml — после этого мое приложение начинает появляться в списке последних приложений, что неприемлемо, поскольку оно позволяет запускать FileUploader оттуда, и, как я упоминал выше, его следует запускать только путем отправки android.intent.action.ОТПРАВЛЯЙТЕ намерения из галереи / камеры.

  3. Используйте то же намерение, что и для запуска 1-го экземпляра — 2-й экземпляр все еще создан, и в журналах есть следующее предупреждение:

    04-12 17:01:17.041: WARN/ActivityMana&er(1289): startActivity вызывается из контекста бездействия; принудительное намерение.FLAG_ACTIVITY_NEW_TASK для: Намерения { act=android.intent.action.ОТПРАВИТЬ тип = ima&e / jpe& cmp=.FileUploader bnds= [0,628][480,723] (имеет дополнительные возможности) }

Я также пытался изменить строку:

     Context context = &etApplicationContext();
  

с

     Context context = this; // FileUploadServiceContext
  

Но это не помогает.

Хммм. Я подумал, может быть, я запускаю неправильное действие. Вероятно, мне следует запустить «родительское» действие для моего загрузчика файлов. Например: если я запускаю FileUploader из галереи, затем нажимаю Home, затем снова запускаю Gallery с главного экрана — я возвращаюсь к своей активности. Итак, я задаюсь вопросом, может быть, мне нужно запустить галерею / камеру из уведомления. Но 2 вопроса:

  1. как определить, что именно было причиной моей активности?

  2. что делать, если этот родительский элемент был закрыт системой?

Ответ №1:

Вы не можете полагаться на возможность «возврата» к какому-либо действию после того, как пользователь от него отказался. ОС может и вполне может уничтожить его, так что возвращаться будет не из чего. Я предлагаю вам добавить дополнительные функции к намерению вашего уведомления и воссоздать действие, чтобы отобразить соответствующие данные из этих дополнительных функций при его запуске.

Комментарии:

1. Я понял. Но в этом случае как: 1. Уничтожить 1-й экземпляр Activity при выходе с помощью кнопки home, но не уничтожать при изменении макета (например)? 2. запретить отображение моей активности в списке последних приложений?

Ответ №2:

Ну, единственный способ, который я нашел для реализации этого, это:

 android:excludeFromRecents="true" android:launchMode="sin&leTask"
  

Это не на 100% то, что я хочу (например. Я не могу вернуться к «родительскому» приложению) после возобновления, но это лучше, чем ничего.