2010-03-05 2 views
31

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

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); 

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

+0

проверить это: http://stackoverflow.com/questions/3305088/how-to-make-notification-intent-resume-rather-than-making-a- new-intent/39482464 # 39482464 – TharakaNirmana

ответ

30

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

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

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

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

вы можете найти подробное объяснение в Android Developers' Guide

Я надеюсь, что это помогает

+1

Спасибо, это было потрясающе. –

+1

Также посмотрите на '' 'android: launchMode =" singleTop "' '', это может также поместиться и указана в разделе «обычные запуски». –

+0

использовать любой из (singleTask, singleTop, singleInstance), я обнаружил, что стек задачи активности был сломан, стек задач очистил всю другую активность – Ninja

-1

Я использую:

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

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

+0

Я пробовал это, но он не работает, можете ли вы дать полный пример уведомления, который работает? –

+0

@EnesBattal Извините, у меня больше нет этого кода (по-другому с моим приложением). Флаг намерений - это один большой беспорядок. Я не думаю, что когда-нибудь это понял. – gnobal

1

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

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

, как мы можем отдать ее ожидающим намерениям? вы можете поделиться кодом – yrahman

+0

здесь ti решено http://stackoverflow.com/questions/31448840/android-how-to-open-last-activity-when-tapping-notification – nAkhmedov

1

У меня была аналогичная проблема, и надлежащим образом чтобы справиться с этим, чтобы использовать флаги: 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

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

1

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

android:launchMode="singleTask" 

например:

<activity 
    android:name=".Main_Activity" 
    android:label="@string/title_main_activity" 
    android:theme="@style/AppTheme.NoActionBar" 
    android:launchMode="singleTask" />