【问题标题】:Android SDK. Get NOTIFICATION_SERVICE to resume, not start new instance安卓 SDK。获取 NOTIFICATION_SERVICE 以恢复,而不是启动新实例
【发布时间】:2012-02-11 20:34:45
【问题描述】:

我的 android 应用程序正在向前发展。我能够实现onDestroy() and onPause() 例程。

我还设法让 Android 的通知服务将带有标题和正文的图标放在通知栏/任务菜单中。

这个通知服务的唯一问题是,如果我的 android 应用程序已经在运行,并且已经启动了 super.onPause(); moveTaskToBack(true);onPause() 函数,如果用户点击通知,它将弹出我的应用程序的新实例.

一旦用户与新实例交互,由于后台版本已经在运行,程序会崩溃,造成冲突。

这是我的通知代码,我需要帮助以使此代码查找我的应用程序的已运行版本:

String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificatonManager = (NotificationManager) getSystemService(ns);
int icon = R.drawable.ic_launcher;
CharSequence tickerText = "app name";
long when = System.currentTimeMillis();
CharSequence contentTitle = "app title";
CharSequence contentText = "text";
Intent notificationIntent = new Intent(this, SuperMicProActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
final int signed = 1;
mNotificatonManager.notify(signed, notification);

我正在查看onResume(),可能是某种bringTaskToFront(this) 选项。这存在吗?

谢谢,

【问题讨论】:

  • 没关系。我只是打开了我的 Manifest 文件并在我的 <activity 标签中添加了android:launchMode="singleTop"

标签: android android-emulator android-2.2-froyo android-notifications


【解决方案1】:

您有一些问题,恕我直言。

并且已经启动了super.onPause();的onPause()函数moveTaskToBack(true);

这是相当奇怪的行为。你为什么要这样做?

一旦用户与新实例交互,由于后台版本已经在运行,程序会崩溃,造成冲突。

那么在原始活动中所做的一切根本不应该在活动中,而应该在服务中。一旦您不再有前台活动,Android 终止您的进程以释放内存的可能性相当高,并且可能发生得相当快,具体取决于其他情况。您似乎仍在以某种方式依赖于较旧的活动。活动的“后台版本”不应该做任何会影响您的流程中任何其他活动的事情,并且不在前台的活动不应该负责做任何如果活动“噗”而用户可能错过的事情。

话虽如此,还有其他原因可以避免创建活动的第二个副本,尤其是导航 - 就目前而言,当用户从活动的第二个副本按返回键时,他们将看到第一个副本,并且弄糊涂了。

我需要帮助以使此代码查找我的应用程序的已运行版本

不,您“需要帮助才能使此代码查找已运行的活动版本”。应用程序不是活动。 Activity 不是应用。

FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP 添加到您的Intent 将解决此问题:

  Intent i=new Intent(this, SuperMicProActivity.class);

  i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

  PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0);

这会将您现有的活动置于前台,并在需要时摆脱您任务中的其他活动。

【讨论】:

  • 非常好。如果您在我的第一个问题下方查看我的评论,我在清单文件中添加了单顶。添加你给我的新意图代码会允许在其他设备上实现更多冗余,还是所有 android 设备都遵循清单文件中的单一顶部?我会在onResume() 中使用它吗?
  • @MarcBrown:所有设备都将遵循清单文件。 “我会在 onResume() 中使用它吗?” -- 你会用onResume()中的什么吗?
  • 我会将onResume() 中的new Intent 代码与@Override 一起使用
  • @MarcBrown:我当然希望不会。您问题中的源代码是创建一个Notification。我的建议是让您根据问题中的源代码向您为Notification 创建的Intent 添加一些标志。
  • 谢谢。我删除了android:launchMode="singleTop" 以确保脚本本身可以运行,并且确实如此。我将launchMode 重新添加到 Manifest 中,程序继续运行。我尝试了onResume(),应用程序无法启动。正是我想要的;后退按钮取消,主页移到后面,通知链接使用已经存在的 ACTIVITY。
【解决方案2】:

是的,这样的事情是可能的。你需要使用标志。

http://developer.android.com/reference/android/content/Intent.html#setFlags(int)

你应该特别研究这两个。

FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TOP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2012-05-06
    • 2013-11-01
    • 2016-08-13
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多