【问题标题】:Android Refresh Activity from NotificationAndroid 从通知刷新活动
【发布时间】:2016-12-11 05:32:34
【问题描述】:

我有一个调用通知的程序。如果您将其拉下,通知将启动一个新活动。

mNotificationManager = (NotificationManager) getSystemService(ns);

int icon = R.drawable.stat_sys_secure_green;
CharSequence tickerText = "Browser Security Enabled";
long when = System.currentTimeMillis();

notification = new Notification(icon, tickerText, when);

Context context = getApplicationContext();
CharSequence contentTitle = "Browser Security";
CharSequence contentText = "Security Vulnerability Detected";
Intent notificationIntent = new Intent(this, PrivacyMessage.class);

//Test Extra
notificationIntent.putExtra("Primary Key", "Primary Text");

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

mNotificationManager.notify(HELLO_ID, notification);

问题出现在代码后面,当我想刷新辅助活动时。主要活动应该能够动态更改其中的附加内容。我尝试通过启动一个新意图来做到这一点。

CharSequence contentTitle = "Browser Security";
CharSequence contentText = "Test New Notification";
Intent intent = new Intent(this, PrivacyMessage.class);
notification.icon = R.drawable.stat_sys_secure_orange;

intent.putExtra("Test Thing", "Test Value");
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent cI = PendingIntent.getActivity(this, 0, intent, 0);
notification.setLatestEventInfo(getApplicationContext(), "New Title", "NewText", cI);
mNotificationManager.notify(HELLO_ID, notification);

现在,当我执行该代码时,会弹出新的通知标题,图标颜色会发生变化,下拉菜单会反映新的标题和添加信息。但是,当我单击它时,它不会以新的意图启动活动。相反,它只是用旧的附加功能提取旧的活动。我尝试了 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_NEW_TASK,但似乎都没有清除旧的辅助活动并创建新活动。知道我该怎么做吗?

【问题讨论】:

  • 请原谅我的误会,但是您想启动一个没有历史记录的新活动,或者您希望旧活动处于前台并刷新其状态?
  • 我希望旧的活动在按下通知时出现在前台,但要更新为新的意图。
  • 您也能帮我解决一下我的问题吗? stackoverflow.com/questions/20149685/…

标签: android android-activity android-intent


【解决方案1】:

显然,这实际上是 android 环境的错误/功能。除非使用唯一的 requestCode 传递 pendingIntent(),否则它只会检索最初使用该编号传递的旧意图。

详细信息可以在这里找到: http://groups.google.com/group/android-developers/browse_thread/thread/ad855bb57042c2bd/e84c8d6fececf6e4?lnk=gst&q=notification#e84c8d6fececf6e4

他们提出的解决方案是在每次调用 pendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags) 时简单地增加 requestCode,并按照我最初使用的方式设置标志

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

这似乎不是一个完美的解决方案,但它确实有效。谢谢大家的帮助!

【讨论】:

  • 或者更好地使用 PendingIntent.FLAG_CANCEL_CURRENT 标志和 PendingIntent.getActivity()
  • PendingIntent.FLAG_CANCEL_CURRENT 标志和 PendingIntent.getActivity() 对我有用
【解决方案2】:

我认为,首先,您应该忘记FLAG_ACTIVITY_NEW_TASK,因为这会打开一个新任务(一组活动),而不会清除您之前打开的任何内容。 FLAG_ACTIVITY_CLEAR_TOP 对您也没有用处,因为如果我正确理解场景,您的任务只有两个活动,而您的目标活动是次要活动。

所以这是我的问题...如果第二段代码在 Activity 上下文中执行,您为什么不直接调用 startActivity 并使用新的附加功能?这将允许您处理辅助活动的 onStart 方法上的新附加功能。

问候。

【讨论】:

  • 我对startActivity的理解是它会立即启动一个新的Activity。我想要发生的是只让它从通知下拉列表中启动活动,但此时让它成为更新版本。我试过了,检查一下,它立即启动了一个新的活动,但随后抛出了一个 android.app.SuperNotCalled 异常。
【解决方案3】:

你是重写onNewIntent() 来捕捉新的意图,还是只是调用getIntent()? onNewIntent() 文档说 getIntent() 将继续返回用于启动活动的原始意图,除非您从 onNewIntent() 调用 setIntent()。

【讨论】:

  • 我实际上只是在调用 getIntent。我刚才尝试添加简单的:public void onNewIntent(Intent intent){ this.setIntent(intent); },但它似乎什么也没做。我还尝试将我的 onCreate 方法格式更改复制到 onNewIntent 方法中。两者都没有做太多。还有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多