所以我在创建从服务打开活动的通知时遇到了一个小问题。我已将问题缩小到似乎是“正在进行的”未决意图和“通知”未决意图之间的冲突。
所以让我描述一下我正在尝试做的事情。
我有一个应用程序,它有一个后台服务轮询来自数据服务器的新数据。即使没有焦点活动,应用程序也会继续轮询数据以允许应用程序通知用户特定事件。(类似于每 10 分钟对新邮件进行一次后台服务轮询)。
我希望用户始终知道应用程序正在运行,因为如果忘记了应用程序,轮询确实会给用户数据计划带来风险。出于这个原因,我在服务的 onCreate 函数中创建了一个“持续”通知。当用户点击正在进行的通知时,该服务应该将主应用程序活动置于最前面或创建一个。这是使用以下代码完成的:
@Override
public void onCreate()
{
super.onCreate();
// the Data object is the actual polling object runnable
data = new Data();
// ui and data intents are used to send data from the service to the activities that need them
ui_intent = new Intent(BROADCAST_ACTION);
data_intent = new Intent(BROADCAST_ACTION);
res = getResources();
// the intent to start the main activity
Intent notificationIntent = new Intent(this, Spectrum.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
notificationIntent, PendingIntent.FLAG_ONE_SHOT);
Notification notification = new Notification(
R.drawable.notification_icon, "", System.currentTimeMillis());
notification.setLatestEventInfo(this, "App Name", "Open App",
contentIntent);
notification.flags |= Notification.FLAG_NO_CLEAR;
startForeground(APP_NOTIFICATION, notification);
}
到目前为止,这段代码运行良好。如果我按下主页按钮,然后点击正在进行的通知,它会调出主要活动(Spectrum.class)
现在除了正在进行的通知之外,我还想要不时发生的特定事件通知。当用户点击这些通知之一时,应用程序将创建一个新的频谱层并将一些信息传递给该活动以显示。(再次非常类似于启动主程序并突出显示新电子邮件的邮件应用程序)。
要创建这些通知,我使用以下代码 private void alert(int alert_id) { String ns = Context.NOTIFICATION_SERVICE; 字符串名称 = data.getData()[alert_id];
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
int icon = R.drawable.notification_icon;
CharSequence tickerText = name + " has an event";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Context context = getApplicationContext();
CharSequence contentTitle = "New Event!";
CharSequence contentText = name;
Intent notificationIntent = new Intent(this, Spectrum.class);
notificationIntent.putExtra(Spectrum.CURRENT_IDX, alert_id);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
if (PreferenceManager.getDefaultSharedPreferences(getBaseContext())
.getBoolean("vibrate", false))
{
notification.defaults |= Notification.DEFAULT_VIBRATE;
}
if (PreferenceManager.getDefaultSharedPreferences(getBaseContext())
.getBoolean("chirp", false))
{
notification.defaults |= Notification.DEFAULT_SOUND;
}
PendingIntent contentIntent = PendingIntent.getActivity(this, alert_id,
notificationIntent, PendingIntent.FLAG_ONE_SHOT);
notification.setLatestEventInfo(context, contentTitle, contentText,
contentIntent);
// I want multiple alerts, up to 1 for every event id so simply set the
// notification id to be the event id.
mNotificationManager.notify(alert_id, notification);
}
这段代码再次运行良好。当事件发生时,将显示通知。如果点击通知,则创建频谱活动并正确处理意图扩展。更具体地说,我已经通过创建多个事件并以各种顺序点击它们进行了测试,并且一切正常
当我按下主页按钮时,问题就出现了,将应用程序带回前面并显示正在进行的通知,然后尝试点击其中一个事件通知。一旦我按下正在进行的通知,事件通知就会停止工作。它们仍然被创建,当我点击它们时,它们被清除,但没有创建新的频谱活动,并且不处理正在传递的数据 (event_id)。(之前的活动保持不变)。
有谁知道为什么事件通知停止工作?
我注意到的一件事是,在我点击事件通知时点击正在进行的服务通知之前,我在 LogCat 中收到一条信息消息,看起来像
10-04 11:39:07.153: W/ActivityManager(102): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { cmp=android.package.test/.Spectrum bnds=[0,369][480,465] (has extras) }
但是在我按下正在进行的服务通知后,我得到了上面的行加上下面的行
10-04 11:42:44.953: W/InputManagerService(102): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4085c650
编辑:忘了提到我正在使用 Eclipse 在 Windows 机器上编码。针对 android 3.2 编译,并在物理 Nexus One 设备上进行测试
有任何想法吗?