2015-06-17 2 views
3

В документе Notification класса я вижу это:Уведомления Android: требуется Intent.FLAG_ACTIVITY_NEW_TASK?

общественного PendingIntent contentIntent

Намерение выполнить, когда запись расширяется статус щелкнул. Если это действие, оно должно содержать флаг FLAG_ACTIVITY_NEW_TASK, который требует, чтобы вы позаботились об управлении задачами, как описано в документе Tasks and Back Stack. В частности, не забудьте прочитать раздел уведомлений Handling Notifications о правильных способах запуска приложения из уведомления.

Я прочитал материалы, связанные с вышеуказанным, но я все еще не понимаю. Почему флаг FLAG_ACTIVITY_NEW_TASK требуется при запуске действия при нажатии на уведомление? Я попытался следующий код:

NotificationManager manager = (NotificationManager)context. 
    getSystemService(Context.NOTIFICATION_SERVICE); 
Notification notification = new Notification(
    android.R.drawable.stat_notify_sync, title, 
    System.currentTimeMillis()); 
notification.flags |= Notification.FLAG_AUTO_CANCEL; 
Intent intent = new Intent(context, NotifiedActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // IS THIS REALLY REQUIRED?? 
PendingIntent pt = PendingIntent.getActivity(context, 0, intent, 0); 
notification.setLatestEventInfo(context, title, text, pt); 
manager.notify(0, notification); 

Я побежал код выше, и с и без intent.setFlags линии, и, кажется, нет никакой разницы. На самом деле, многие образцы кода, которые я нашел, просто не имеют этой строки. Итак, почему в документе говорится, что флаг FLAG_ACTIVITY_NEW_TASK является обязательным, и какая разница в обработке уведомлений?

ответ

8

Технически этот флаг необходим. Но так как это требуется, Android приятно и просто установить его для вас ;-)

Причина, по которой требуется выглядит следующим образом:

Код, который обрабатывает Notification и вызовы startActivity() на самом деле запустить Intent , не работает в «задаче». Это системный код, входящий в систему Notification. Обычно, если вы звоните startActivity(), а флаг Intent.FLAG_ACTIVITY_NEW_TASK - не установлен, Android попытается запустить эту операцию в текущую задачу (то есть: задача, содержащая операцию, которая вызывает startActivity()). Так как в этом случае не является задачей, Android должен запустить Activity в другую задачу. Вот почему вам нужно указать Intent.FLAG_ACTIVITY_NEW_TASK.

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

ПРИМЕЧАНИЕ. Такая же ситуация существует, если вы позвоните startActivity() из Service или BroadcastReceiver. В этих случаях флаг Intent.FLAG_ACTIVITY_NEW_TASKдолжен быть установлен, потому что нет «текущей задачи», поэтому Android должен запустить Activity в другую задачу.

+1

Очень четкие объяснения. Спасибо! – ycsun

Смежные вопросы