Android: какой флаг намерения использовать для такой неразрушенной активности не будет автоматически отображаться при уведомлении - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть 3 занятия

A.MainActivity - просто действие с текстом и кнопкой на нем

B.SettingsActivity - это будет отображаться, если нажата кнопка на (A), это инициализирует таймер, который отправит уведомление при тревоге

C.DisplayNotification - действие по отображению уведомления в строке состояния, при щелчке на котором должно отображаться A

. Я хочу, чтобы это произошло:

  1. Запускаю приложение, отображается A
  2. Я нажимаю кнопку, будет отображаться B
  3. Я установил время для будильника
  4. Когда срабатывает будильник, в строке состояния отображается уведомление
  5. Если я нажму на уведомление, появится A

Вот что происходит (у меня 2 сценария с разными результатами):

Первый сценарий:

  1. После шага 3 я нажимаю кнопку «Назад», теперь будет отображаться «A»
  2. Затем я снова нажимаю кнопку «Назад», вызывается onDestroy of A и на экране отображается «домашняя страница».или «рабочий стол» телефона
  3. Я жду, пока сработает будильник
  4. Когда срабатывает будильник, в строке состояния отображается уведомление
  5. Я нажимаю на уведомление, оно запускаетсямое приложение отображает A
  6. Конец истории.Это то, что должно произойти

Второй сценарий: (ошибочный)

  1. После шага 3 я нажимаю кнопку HOME, onDestroy A еще не вызывается ипоследний экран был B
  2. На экране отображается «домашняя страница» или «рабочий стол» телефона
  3. Я жду, пока сработает будильник
  4. Когда срабатывает тревога, уведомлениеотображается в строке состояния, а B отображается автоматически, а я не щелкаю уведомление в строке состояния
  5. . Здесь я хочу, чтобы на экране не отображалась активность B.

Я пропускаю какие-либо флаги для уведомления или намерения?

Вот фрагмент кода для Действия B, который вызывает тревогу

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, DisplayNotification.class);
i.putExtra("NotifID", 1);
PendingIntent displayIntent = PendingIntent.getActivity(getBaseContext(), 0, i, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, displayIntent);

Вот код для Действия C

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int notifID = getIntent().getExtras().getInt("NotifID");
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    i.putExtra("NotifID", notifID);  
    PendingIntent detailsIntent = PendingIntent.getActivity(this, 0, i, 0);
    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notif = new Notification(R.drawable.ic_launcher, "See activity!", System.currentTimeMillis());
    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notif.defaults |= Notification.DEFAULT_SOUND;
    CharSequence from = "Notification from me";
    CharSequence message = "See activity!";        
    notif.setLatestEventInfo(this, from, message, detailsIntent);
    nm.notify(notifID, notif);
    finish();
}

Надеюсь, кто-нибудь мне поможет:)

Спасибо!

Редактировать:

Спасибо Chirag_CID!Я должен был использовать Broadcast Receiver вместо другого занятия.Таким образом, вместо расширения Activity, DisplayNotification теперь расширяет приемник вещания.Это метод onReceive DisplayNotification:

public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "DisplayNotification onReceive");
    int notifID = intent.getExtras().getInt("NotifID");
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    i.putExtra("NotifID", notifID);  
    PendingIntent detailsIntent = PendingIntent.getActivity(context, 0, i, 0);
    NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notif = new Notification(R.drawable.ic_launcher, "See the quote of the day!", System.currentTimeMillis());
    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notif.defaults |= Notification.DEFAULT_SOUND;
    CharSequence from = "Notification";
    CharSequence message = "See the activity!";        
    notif.setLatestEventInfo(context, from, message, detailsIntent);
    nm.notify(notifID, notif);
}

1 Ответ

2 голосов
/ 29 февраля 2012

Я прочитал весь Вопрос 2-3 раза ..

Теперь я хочу указать на несколько вещей там,

Вы сделали Activity C, в котором вы находитесь создание уведомления , которое будет вызывать MainActivity при его нажатии .

Но, когда вы устанавливаете сигнал тревоги от B , вы передаете intent of Activity C, хотя ваш кодC не имеет setContentView метода, а также у вас есть написано finish () в конце onCreate (), поэтому, когда Activity C вызывается через Alarm, установленный изB, он просто вызывает действие C и устанавливает Notification .. но как только вы написали Finish () , он завершает действие C и показывает последнее действие из стека .

Если вы хотите перепроверить.. Записывайте журналы в onCreate (), onPause () и onDestroy () действия C .., и вы увидите, что действие C создается и уничтожается при срабатывании тревоги.

Решение:Если вы не хотите показывать какие-либо действия, когда вы находитесь на главном экране и триггере тревоги, то в действии B, где выВы написали ожидающее намерение для действия C .. Вам понадобится изменить для вызова Broadcast Receiver и использовать PendingIntent.getBroadcast, где его PendingIntent.getActivity и код, который вы написали в C для уведомления, вам придется напишите, что в Receiver ... следовательно, никакая ваша деятельность не будет вызвана при срабатывании тревоги.

Happy Coding:)

...