所以我在创建从服务中打开活动的通知时遇到了一个小问题。我已将问题缩小到“正在进行的”未决意图和“通知”未决意图之间的冲突。
所以让我来描述我想要做的事情。
我有一个应用程序,它有一个后台服务轮询来自数据服务器的新数据。即使没有焦点活动允许应用程序通知用户特定事件,应用程序也会继续轮询数据。 (类似于每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; String name = 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);
}
此代码再次正常工作。事件发生时,将显示通知。如果点击通知,则创建频谱活动并正确处理意图extas。更具体地说,我已经测试了多个正在创建的事件并以各种顺序点击它们,一切都运行良好
问题出现在我按下主页按钮,将应用程序带回正面并持续通知,然后尝试点击其中一个事件通知。一旦我按下正在进行的通知,事件通知就会停止工作。它们仍然被创建,当我点击它们时它们被清除但没有创建新的频谱活动并且不处理传递的数据(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设备上进行测试
有什么想法吗?