从通知中恢复应用程序和堆栈

oli*_*erg 58 android

我希望以与用户在启动器中点按其图标时完全相同的方式从状态栏通知中恢复我的应用.

那就是:我希望堆栈处于与用户离开之前相同的状态.

在通知上设置待处理意图时的问题是它始终以特定活动为目标.我不想要这个.我需要像启动器那样恢复应用程序.

因此,如果用户处于活动A中,我想恢复活动A.如果他已从活动A启动活动B,那么我希望在用户点击通知时显示B,并且要恢复堆栈以便A获得用户点击B中的后退按钮时恢复

还有其他几个问题与类似的标题,但没有一个解决我的问题.

GrA*_*And 151

只需使用Android启动应用时使用的相同意图过滤器:

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

由于Intent您在Activity通知栏中创建的打开方式与用于启动应用程序的Android相同,因此Activity将显示之前打开的内容而不是创建新应用程序.

  • 它对我没有任何帮助.我正在尝试使用nexus 5. (6认同)
  • 只是一个问题:如果特定/替代发射器使用略有不同的意图怎么办?也许与其他一些额外的东西或类别..你认为我应该缓存我的应用程序启动时的原始意图(由Activity.getIntent()检索),并使用原样创建我的待定意图? (2认同)
  • 我为我工作,我有两个激活splash和mainactivity,在使用上面的代码修改我的代码后,它恢复mainactive而不启动新的活动.谢谢你... (2认同)
  • 尝试棒棒糖,它不起作用.刚刚打开一个新的'YourActivity' (2认同)

Tho*_*mas 29

对于您不希望/无法对启动器活动进行硬编码的情况,此解决方案可以正常工作

Intent i = getPackageManager()
    .getLaunchIntentForPackage(getPackageName())
    .setPackage(null)
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0);

return new NotificationCompat.Builder(context)
        ...
        .setContentIntent(pendingIntent)
        .build();
Run Code Online (Sandbox Code Playgroud)

setPackage(空)的部分是关键,因为没有它的应用程序没有恢复到以前的任务在我的情况.我将我的意图与Android启动器的意图进行了比较,并注意到pkg没有设置在那里,所以我想出了如何从意图中删除包名.

我的特殊情况是通知是在库中创建的,因此我无法知道启动器活动是什么.