#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.
Итак, есть ли какой-нибудь способ «вернуться» к первому действию при нажатии на уведомление вместо запуска нового?
Я пробовал следующие способы, но ни один из них здесь не работает:
-
вызовите finish() в методе FileUploader.onStop() — действие закрывается при переключении с книжной ориентации на альбомную.
-
установите android:launchMode=»sin&leTask» для действия FileUploader в AndroidManifest.xml — после этого мое приложение начинает появляться в списке последних приложений, что неприемлемо, поскольку оно позволяет запускать FileUploader оттуда, и, как я упоминал выше, его следует запускать только путем отправки android.intent.action.ОТПРАВЛЯЙТЕ намерения из галереи / камеры.
-
Используйте то же намерение, что и для запуска 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:
Вы не можете полагаться на возможность «возврата» к какому-либо действию после того, как пользователь от него отказался. ОС может и вполне может уничтожить его, так что возвращаться будет не из чего. Я предлагаю вам добавить дополнительные функции к намерению вашего уведомления и воссоздать действие, чтобы отобразить соответствующие данные из этих дополнительных функций при его запуске.
Комментарии:
1. Я понял. Но в этом случае как: 1. Уничтожить 1-й экземпляр Activity при выходе с помощью кнопки home, но не уничтожать при изменении макета (например)? 2. запретить отображение моей активности в списке последних приложений?
Ответ №2:
Ну, единственный способ, который я нашел для реализации этого, это:
android:excludeFromRecents="true" android:launchMode="sin&leTask"
Это не на 100% то, что я хочу (например. Я не могу вернуться к «родительскому» приложению) после возобновления, но это лучше, чем ничего.