1

所以我在创建从服务打开活动的通知时遇到了一个小问题。我已将问题缩小到似乎是“正在进行的”未决意图和“通知”未决意图之间的冲突。

所以让我描述一下我正在尝试做的事情。

我有一个应用程序,它有一个后台服务轮询来自数据服务器的新数据。即使没有焦点活动,应用程序也会继续轮询数据以允许应用程序通知用户特定事件。(类似于每 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 设备上进行测试

有任何想法吗?

4

0 回答 0