通知恢复活动

9
我知道,有很多这种类型的问题,但我尝试了所有方法,仍然无法解决。
我的应用程序中有一个Activity,在这个Activity中,有4个选项卡,第四个选项卡包含一个列表和一个记录按钮。当我点击记录按钮时,它会启动GPS监听器。在获取新的GPS值后,它将其推送到列表中。
到目前为止,这个功能是正常工作的!
如果我点击主页按钮它仍然可以运行,如果我长按主页按钮,它则会恢复到特定选项卡打开的那个Activity,并且列表仍然保留了列表项并且GPS监听器仍然处于活动状态。
这也完全没有问题!
现在我想添加一个通知,它以.number的形式显示列表的GPS值数量。每当收到新的GPS信号时,它会更新通知图标上的数字。这不是问题,但单击通知的操作会完全破坏我的应用程序。

实际代码看起来像这样:

public void callNotify(String text) {
    notif = new Notification();
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.icon = R.drawable.icon;
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    notif.ledARGB = Color.RED;
    notif.ledOnMS = 200;
    notif.ledOffMS = 200;
    notif.flags = Notification.FLAG_SHOW_LIGHTS
        | Notification.FLAG_ONGOING_EVENT
        | Notification.FLAG_ONLY_ALERT_ONCE;
    notif.number = notifyNumber;
    mNotificationManager.notify(notifyNumber, notif);
}

public void updateNotify(String text) {
    notifyNumber++;
    notif.number = (int) (notifyNumber / 2);
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    mNotificationManager.cancel((notifyNumber - 2));
    mNotificationManager.notify(notifyNumber, notif);
}

所以,updateNotify()在接收到新的GPS信号时被调用。而callNotify()是第一个被调用的,在它开始监听GPS之前。是的,notifyNumber/2是我的意图,因为我还要用到那个数字。
如果我像这样编译它,并点击通知,它会在第一个选项卡上打开一个新的tabactivity。如果我点击返回,就会出现很多错误(数据库仍然打开,空指针等)。我认为这是因为它启动了一个新的tabactivity,而另一个仍然开着,因为我可以看到GPS监听器仍在工作。
所以,我想做的是: 我打开我的应用程序,进入tabactivity,打开第4个选项卡,点击记录。如果我点击返回,它应该隐藏应用程序,如果我只是点击主页按钮也是一样的。但是有一个通知。 如果我点击它,它应该只是再次显示隐藏的活动,就这样。 那么,我在哪里做错了呢? 我认为FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP标志应该解决这个问题?
1个回答

6
这里发生的事情有点混乱,所以请耐心听我解释。根据文档,FLAG_ACTIVITY_SINGLE_TOP如果设置,那么如果该活动已经在历史堆栈的顶部运行,则不会启动该活动。因此,如果当前活动不在历史堆栈的顶部,则会重新启动它。
再次根据文档,FLAG_ACTIVITY_CLEAR_TOP如果设置,并且要启动的活动已经在当前任务中运行,则不会启动该活动的新实例,而是将其上面的所有其他活动关闭,并将此 Intent 作为新 Intent 传递给(现在位于顶部的)旧活动。
默认情况下,TabActivity始终打开到标签0,您可以使用setDefaultTab通过代码更改它。TabHost 中的每个选项卡也是一个新的Intent
引用一段话:"如果我像这样编译它,并单击通知,则会在第一个选项卡上打开一个新的 TabActivity。如果我然后单击返回,我会得到很多错误(数据库仍然打开,空指针等)。"
我认为这是因为当前的Intent是tab4(实际上是#3,0,1,2,3),而您的通知正在带来tabactivity.class。由于它不活动或不在堆栈的顶部,因此其上面的每个操作都将关闭,包括tab4。
引用一段话:"所以,我想做以下事情:打开我的应用程序,转到TabActivity,打开选项卡4,单击记录。如果我单击返回,则应该隐藏应用程序,同样,如果我只是单击主页按钮。但是有一个通知。如果我单击它,它应该只显示隐藏的活动,就这样。那么,我在那里做错了什么?我认为,标志 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_SINGLE_TOP 应该解决问题吗?"
您混淆了标志的作用以及homeback键的作用。按下home将隐藏您的活动,并且通知应该使用这些标志正常工作(一旦您解决了我之前提到的问题)。但是,当您按下back时,Android会结束当前的Activity并将其从堆栈中删除。由于它下面没有任何内容,因此在按下通知时被迫重新启动。

1
其实我知道为什么它会跳到第一个选项卡。Tabactivity通常从第一个选项卡开始,但第四个选项卡有GPS列表。所以对我来说,逻辑上它应该打开Tabactivity两次。因为此时未加载列表和其他初始数据。所以,标志位是错误的吗?我不太明白... - Keenora Fluffball
2
哦,等等……如果我只使用FLAG_ACTIVITY_SINGLE_TOP而不是两个标志,它似乎可以工作。好的,如果这是错误,我完全误解了文档。抱歉! - Keenora Fluffball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接