use*_*003 1 notifications android android-intent android-pendingintent
好的,在这里忍受我
我的应用程序由闪屏活动(A)和主要活动(B)组成.当应用程序启动时,(A)显示一点,然后启动(B).之后(A)结束.这在"正常"条件下工作正常.这是启动的代码(B)
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent mainIntent = new Intent(A.this, B.class);
startActivity(mainIntent);
finish();
}
}, SPLASH_DELAY);
Run Code Online (Sandbox Code Playgroud)
当通知到达时,用户点击它.我是通过PendingIntent开始的(A):
Intent mIntent = new Intent(this, A.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, mIntent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon()... //build the whole notification
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(0, mBuilder.build());
Run Code Online (Sandbox Code Playgroud)
这开始于(A)然后是(B)并且一切都很好.
然而...
一旦应用程序在屏幕上显示并且第二个通知到达(A)不再启动,也不会在(B)中收到任何回调
阅读http://developer.android.com/guide/components/tasks-and-back-stack.html#ActivityState上的文档我得出结论,我应该使用FLAG_ACTIVITY_NEW_TASK设置启动(A)以便它启动一个新任务只有在(A)尚未运行),我也应该开始(B)与标志FLAG_ACTIVITY_SINGLE_TOP(这样我就可以得到一个回调B.onNewIntent() ,因为B将被运行).所以我做了
...
mainIntent.setFlags(FLAG_ACTIVITY_NEW_TASK);
....
mIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
....
Run Code Online (Sandbox Code Playgroud)
但是,不,不.这种行为似乎根本没有改变.
我错过了文档中的内容吗?在我看来,每次在我的情况下FLAG_ACTIVITY_NEW_TASK应该开始(A),因为到第二个通知到达时.(A)已经完成,但它什么也没做.
你能给我一些关于如何获得回调的信息,这样我就能向用户显示正确的信息吗?
谢谢
对于通知,您已为任务创建了一个PendingIntent根活动("开始"活动),并且您已设置FLAG_ACTIVITY_NEW_TASK.这将执行以下操作:
如果应用程序没有运行,它会创建一个新的任务和发射活动A到它
如果您的应用程序已经在运行(即:已经有一个活动任务是通过启动活动启动的A,即使活动A不再存在),它也会将该任务带到前台,无论它处于什么状态.这不会创建任何新活动,也不会呼吁onNewIntent()任何现有活动.这纯粹是"将我的任务带到前台"的"简写",类似于用户从"最近任务列表"中选择应用程序时发生的情况.
如果您希望应用程序在每次用户单击通知时获取某些信息,则您需要:
使用您从通知中启动的单独活动.此活动不能是根活动(即:应用程序的"开始"活动.此活动将在用户选择通知时启动.如果您的应用程序已在运行,此活动将启动到您的现有任务中然后,它可以确定应用程序是否已经在运行(用于Activity.isTaskRoot()确定它)并执行适当的操作(例如,如果应用程序尚未运行,则启动根活动).
从通知中启动根活动时,请使用以下标志组合:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP.这将从根活动之上的任务中删除任何其他活动,并将调用onNewIntent()根活动.这是你的"回调".注意:这仅在您的根活动(启动活动)尚未完成时才有效!这意味着当活动A开始活动B时,它不能调用finish()
| 归档时间: |
|
| 查看次数: |
5219 次 |
| 最近记录: |