Как открыть последнее действие в строке состояния уведомления? - PullRequest
5 голосов
/ 08 февраля 2012

Я хочу открыть последнее запущенное действие, нажав на уведомление в строке состояния. Предположим, я запускаю действие A (основное действие моего приложения), и это действие отправляет уведомление в строку состояния уведомлений. действие A также открывает действие B, а B открывает другое действие C. В C i нажмите кнопку возврата домой. Теперь я хочу снова зайти в свое приложение, поэтому в панели уведомлений я нажимаю на уведомление (которое было отправлено A). Здесь уведомление должно начать действие C, потому что оно было открыто в последний раз.

Я искал по этому вопросу, но не нашел правильного ответа. Заранее спасибо.

Ответы [ 4 ]

22 голосов
/ 25 апреля 2012

Несколько дней назад я получил очень простое решение для моей проблемы.Вместо итерации по recentTasks и получения нашей задачи, а затем по ней baseIntent мы можем сделать простую вещь следующим образом:

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setAction(Intent.ACTION_MAIN);

baseIntent содержит те же параметры, что и выше Intent имеет,Следовательно, вместо того, чтобы брать baseIntent из recentTasks, неплохо использовать приведенный выше код.

Этот notificationIntent будет передан pendingIntent для дальнейшего использования.

При условии: MainActivity - это самое первое действие, когда мы запускаем наше приложение, и в AndroidManifest.xml оно должносодержат IntentFilters из CATEGORY_LAUNCHER и ACTION_MAIN.

7 голосов
/ 20 марта 2012

Так как я не получил никакого ответа после поиска по этому вопросу, я прекратил попытки, но всего за несколько дней до того, как я попытался снова, и я нашел РЕШЕНИЕ. :) Я помещаю это здесь.

Но прежде всего я просто хотел переопределить мою проблему, и это было :: «Получение фоновой задачи на передний план из панели уведомлений о состоянии», т. Е. Когда я помещаю свое приложение в фоновый режим, нажимая кнопку «Домой», а затем заставляю его появляться на переднем плане все действия должны выходить на передний план в том же порядке, в котором они находятся в стеке приложения.

Для этого мне нужно было Pending Intent, которое при каждом запуске выводит мое приложение на передний план.

Здесь, когда мое приложение запускается, в строку состояния помещается уведомление, которое остается там до тех пор, пока мое приложение не запустится на устройстве.

Итак, вот код, который я пробовал:

NotificationManager nm = (NotificationManager) getSystemService(context.NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.flag = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

Intent nIntent = new Intent();

final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

final List<RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0);
String myPkgNm = getPackageName();

if (!recentTaskInfos.isEmpty()) {
     RecentTaskInfo recentTaskInfo;
     final int size = recentTaskInfo.size();
     for (int i=0;i<size;i++) {
         recentTaskInfo = recentTaskInfos.get(i);
         if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) {
             nIntent = recentTaskInfo.baseIntent;
             nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
     }
 }
 PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0);
 notification.setLatestEventInfo(getContext(), "some Title", "some text", pi);
 nm.notify(0,notification); 

Основным ключом здесь является baseIntent, документация которого гласит: Исходный Намерение, использованное для запуска задачи. Вы можете использовать это намерение для повторного запуска задание (если оно больше не выполняется) или вывести текущее задание на передний план.

Документация FLAG_ACTIVITY_NEW_TASK гласит: Если при использовании этого флага уже выполняется задание для действия, которое вы сейчас запускаете, то новое действие не будет запущено; вместо этого текущее задание будет просто выведено на переднюю часть экрана в том состоянии, в котором оно было последним.

Сначала я использовал его, но он не работает, как говорится, и есть много вопросов по этому поводу.

В любом случае ... до сих пор я находил этот способ хорошим для вывода задач на передний план, как это делает значок на главном экране Android.

Но, пожалуйста, расскажите мне о минусах этого пути, чтобы я мог улучшить.

:)

5 голосов
/ 30 декабря 2012

Вы пробовали это:

final Intent intent = new Intent(context, YourActivity.class)
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

Приведенные выше коды инструктируют Android, чтобы открыть последнее действие, будь то основное действие или действие предпочтения (которое в настоящее время находится на переднем плане), которое вы использовали для создания / запуска значка в панели уведомлений.

ACTION_MAIN и CATEGORY_LAUNCHER относятся к директивам <action android:name="android.intent.action.MAIN"/> и <category android:name="android.intent.category.LAUNCHER"/> соответственно в вашем файле AndroidManifest.xml.

2 голосов
/ 01 октября 2015

Всегда работал для меня.

Manifest

launchMode="singleTop" #For Launcher activity
never use "singleTask" as a launchMode
set no launchMode for other activities. (if not needed)

Намерение уведомления

Intent notificationIntent = new Intent();
notificationIntent.setClass(this, LaucherActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
...