Android:使用什么 Intent 标志,以便未破坏的 Activity 不会在通知时自动显示

标签 android android-intent notifications android-activity

我有 3 项 Activity

A. MainActivity - 只是一个带有文本和按钮的 Activity

B. SettingsActivity - 如果单击 (A) 上的按钮,将显示此内容,这将初始化时间选择器,该选择器将在警报时发送通知

C. DisplayNotification - 用于在状态栏中显示通知的 Activity ,单击时应显示 A

这就是我想要发生的事情:

  1. 我启动我的应用程序,将显示 A
  2. 我点击按钮,B将会显示
  3. 我设置了闹钟时间
  4. 当闹钟触发时,状态栏中会显示通知
  5. 如果我点击通知,则会显示 A

这就是发生的情况(我有两种不同结果的场景):

第一个场景:

  1. 第 3 步后,我点击后退按钮,现在将显示 A
  2. 然后,我再次点击后退按钮,A的onDestroy将被调用,屏幕将显示手机的“主页”或“桌面”
  3. 我等到闹钟触发
  4. 当闹钟触发时,状态栏上会显示通知
  5. 我点击通知,它会启动我的应用并显示 A
  6. 故事结束。这是预期会发生的事情

第二种情况:(有问题的情况)

  1. 第3步后,我点击HOME按钮,A的onDestroy尚未调用,最新的屏幕是B
  2. 屏幕显示手机的“主页”或“桌面”
  3. 我等到闹钟触发
  4. 当闹钟触发时,通知会显示在状态栏上,并且 B 会自动显示,而无需我点击状态栏上的通知
  5. 我希望这里发生的是它不应该自动显示 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 处使用 PendingIntent.getBroadcast。 getActivity 以及您用 C 语言编写的通知代码,您必须在 Receiver 中编写该代码...因此,当警报触发时,您的任何 Activity 都不会被调用。

快乐编码:)

关于Android:使用什么 Intent 标志,以便未破坏的 Activity 不会在通知时自动显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9497760/

相关文章:

android相机导致空指针异常

android - 将文件从内部存储附加到电子邮件

android - 通过 Intent 分享图片(Facebook 等)

xamarin - 如何在 Xamarin/Android 上启用多个 BLE 特征通知?

ios - 如何在应用程序处于终止状态时在 iOS 设备中接收消息以及如何在打开 wifi/移动数据时提醒应用程序

安卓|主屏幕上的书签图标

java - Imageview 不采用卡片 View 的角半径

android - Volley vs Aquery vs Android 异步 HTTP

java.net.ConnectException : failed to connect to localhost/127. 0.0.1(端口 80):连接失败:ECONNREFUSED(连接被拒绝)

javascript - 如何向我的网页添加交互式通知徽章?