возобновление активности из уведомления - PullRequest
35 голосов
/ 05 марта 2010

В строке состояния моего приложения есть уведомление:

    Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis());

    Intent notificationIntent = new Intent(this.parent, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0);

    ...

    notification.flags = Notification.FLAG_ONGOING_EVENT;        
    mNotificationManager.notify(NOTIFICATION_ID, notification);

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

Ответы [ 6 ]

32 голосов
/ 12 апреля 2011

Я решил эту проблему, изменив launchMode своей активности на singleTask в файле androidManifest.xml.

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

Действия "singleTask" и "singleInstance" могут только начать задачу. Они всегда находятся в корне стека активности. Более того, устройство может одновременно хранить только один экземпляр активности - только одну такую ​​задачу. [...]

Режимы "singleTask" и "singleInstance" также отличаются друг от друга только в одном отношении: действие "singleTask" позволяет другим действиям быть частью его задачи. Это всегда в корне его задачи, но другие действия (обязательно «стандартные» и «одиночные» действия) могут быть запущены в эту задачу. С другой стороны, действие "singleInstance" не позволяет другим действиям быть частью его задачи. Это единственное занятие в задании. Если он запускает другое действие, то это действие назначается другой задаче, как если бы FLAG_ACTIVITY_NEW_TASK был в намерении.

Вы можете найти подробное объяснение в Руководстве для разработчиков Android

Надеюсь, это поможет

1 голос
/ 07 августа 2015

У меня была похожая проблема, и правильный способ ее решения - использовать флаги: Intent.FLAG_ACTIVITY_CLEAR_TOP и Intent.FLAG_ACTIVITY_SINGLE_TOP, например так:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Из документации это будет:

FLAG_ACTIVITY_CLEAR_TOP

Если установлено, и запускаемое действие уже выполняется в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действиясверху оно будет закрыто, и это намерение будет доставлено (теперь уже сверху) старому действию в качестве нового намерения.

FLAG_ACTIVITY_SINGLE_TOP

Если установлено, действие не будет запущено, если оно уже выполняется в верхней части стека истории.

0 голосов
/ 10 декабря 2018

У меня было противоречивое поведение между устройствами с некоторыми намерениями, теряющими дополнительные функции, и методами OnNewIntent и onCreate MainActivity оба вызываемых.

Что не работает :

Manifest:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">

Услуги:

    Intent notificationIntent = new Intent(this.getBaseContext(), MainActivity.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    notificationIntent.putExtra("TEST", 1);

Что сработало :

Manifest:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">

Услуги:

    PackageManager pm = getPackageManager();
    Intent launchIntent = m.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID);
    launchIntent.putExtra("TEST", 2);
0 голосов
/ 24 ноября 2017

Добавьте эту строку к соответствующему действию в файле манифеста вашего приложения.

android:launchMode="singleTask"

например:

<activity
    android:name=".Main_Activity"
    android:label="@string/title_main_activity"
    android:theme="@style/AppTheme.NoActionBar"
    android:launchMode="singleTask" />
0 голосов
/ 14 ноября 2014

Я только что нашел решение этой проблемы: я создал getPreviousIntent и передал его PendingIntent, вот и все:

private Intent getPreviousIntent(Intent newIntent) {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0);
    String myPkgNm = getPackageName();

    if (!recentTaskInfos.isEmpty()) {
        ActivityManager.RecentTaskInfo recentTaskInfo;
        for (int i = 0; i < recentTaskInfos.size(); i++) {
            recentTaskInfo = recentTaskInfos.get(i);
            if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) {
                newIntent = recentTaskInfo.baseIntent;
                newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
        }
    }
    return newIntent;
}
0 голосов
/ 05 марта 2010

Я использую:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.setAction(Intent.ACTION_MAIN);

Не уверен, что это значения, которые нужно установить, но ответ в этих методах / флажках.

...