我有 3 项 Activity
A. MainActivity - 只是一个带有文本和按钮的 Activity
B. SettingsActivity - 如果单击 (A) 上的按钮,将显示此内容,这将初始化时间选择器,该选择器将在警报时发送通知
C. DisplayNotification - 用于在状态栏中显示通知的 Activity ,单击时应显示 A
这就是我想要发生的事情:
- 我启动我的应用程序,将显示 A
- 我点击按钮,B将会显示
- 我设置了闹钟时间
- 当闹钟触发时,状态栏中会显示通知
- 如果我点击通知,则会显示 A
这就是发生的情况(我有两种不同结果的场景):
第一个场景:
- 第 3 步后,我点击后退按钮,现在将显示 A
- 然后,我再次点击后退按钮,A的onDestroy将被调用,屏幕将显示手机的“主页”或“桌面”
- 我等到闹钟触发
- 当闹钟触发时,状态栏上会显示通知
- 我点击通知,它会启动我的应用并显示 A
- 故事结束。这是预期会发生的事情
第二种情况:(有问题的情况)
- 第3步后,我点击HOME按钮,A的onDestroy尚未调用,最新的屏幕是B
- 屏幕显示手机的“主页”或“桌面”
- 我等到闹钟触发
- 当闹钟触发时,通知会显示在状态栏上,并且 B 会自动显示,而无需我点击状态栏上的通知
- 我希望这里发生的是它不应该自动显示 B Activity 。
我是否缺少任何通知或 Intent 标记?
这是触发警报的 Activity B 的代码 fragment
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);
这是 Activity 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!我应该使用广播接收器而不是另一个 Activity 。因此,DisplayNotification 现在扩展了 Broadcast Receiver,而不是扩展 Activity。这是DisplayNotification的onReceive方法:
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);
}
最佳答案
我把整个问题读了 2-3 遍..
现在我想指出一些事情,
您已经创建了Activity C
,其中创建通知,该通知将在其Click 上调用MainActivity。
但是,当您从 B 设置警报时,您正在传递 Activity C
的 Intent ,尽管您的 C
代码确实如此” t 有 setContentView
方法,并且您还在 onCreate() 的末尾编写了 finish() ,因此当通过 B 中设置的警报调用 Activity C 时,它只是调用 Activity C 并设置通知..但是当您编写 finish() 时,它会结束 Activity C 并显示堆栈中最新的 Activity B。
如果你想交叉检查.. 在Activity C的onCreate()、onPause()和onDestroy()中写入日志..您将看到Activity C被创建并在警报触发时被销毁。
解决方案:
如果您不想在主屏幕和闹钟触发器上显示任何 Activity ,
在您为 Activity C 编写待处理 Intent 的 Activity B 中。您将需要将其更改为调用广播接收器,并在其 PendingIntent 处使用
以及您用 C 语言编写的通知代码,您必须在 Receiver 中编写该代码...因此,当警报触发时,您的任何 Activity 都不会被调用。PendingIntent.getBroadcast
。 getActivity
快乐编码:)
关于Android:使用什么 Intent 标志,以便未破坏的 Activity 不会在通知时自动显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9497760/