如何以Android Launcher的方式启动应用程序(恢复)

如何以Android Launcher的方式启动应用程序(恢复),android,android-intent,android-activity,launcher,Android,Android Intent,Android Activity,Launcher,关于如何在Android应用程序中启动应用程序,有很多问题/答案。但这些解决方案不会产生与Android launcher中点击图标相同的流量。 例如,我这样做(与通知一起使用): 然后,当我点击通知时,应用程序启动,但是,它的启动方式与我点击应用程序抽屉中的图标时有所不同。具体来说:使用这种方法,我的主要活动总是被创建的(即onCreate()然后调用onResume()。但是,如果应用程序已经启动,然后放在后台,那么从启动器启动它只会导致调用当前显示的活动的onResume()(而不是主活动

关于如何在Android应用程序中启动应用程序,有很多问题/答案。但这些解决方案不会产生与Android launcher中点击图标相同的流量。 例如,我这样做(与通知一起使用):

然后,当我点击通知时,应用程序启动,但是,它的启动方式与我点击应用程序抽屉中的图标时有所不同。具体来说:使用这种方法,我的主要活动总是被创建的(即onCreate()然后调用onResume()。但是,如果应用程序已经启动,然后放在后台,那么从启动器启动它只会导致调用当前显示的活动的onResume()(而不是主活动的onCreate())。有没有办法从我的应用程序中以编程方式触发相同的简历流


总结任务:当用户点击通知时,我需要启动我的应用程序(如果它还没有启动),或者在当前状态下(如果它在后台)将其带到前台,并将一些数据传递给它。然后,应用程序将负责处理/呈现该数据。

以下是我的onPause代码,其工作方式与您预期的相同,即当用户单击通知时,它不会再次调用onCreate:

notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
        intent = new Intent(getApplicationContext(), PlayerActivity.class);     
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pIntent = PendingIntent.getActivity(getBaseContext(), 0, intent,0);
        NotificationCompat.Builder noti =
                new NotificationCompat.Builder(this)
                .setSmallIcon(android.R.drawable.ic_media_play)
                .setContentTitle("Nepali Music And more")
                .setContentText("Playing");
    noti.setContentIntent(pIntent);
    noti.setAutoCancel(true);
    noti.setOngoing(true);
     Notification notification = noti.getNotification();


        notificationManager.notify(1, notification);

主要关注意图标志

您希望使用意图标志
intent.FLAG\u ACTIVITY\u CLEAR\u TOP
查找您的活动并清除其上方的堆栈。您还需要
Intent.FLAG\u ACTIVITY\u SINGLE\u TOP
标志来防止重新创建您的活动(以继续)


Intent.FLAG\u ACTIVITY\u SINGLE\u TOP
是必需的,因为默认情况下,启动模式是“标准”模式,允许您创建活动的多个实例。如果要将启动模式设置为
SingleTop
,则无需使用此标志您的应用程序正在按其预期方式运行。即使您尝试从应用程序抽屉启动应用程序,它也会调用相同的回调。你必须了解生命周期。由于您的活动处于后台,onCreate将不会被调用。但是为了处理来自通知意图的数据,应该在活动中使用回调方法OnNewIntent()。您应该重写此方法,从新的意图中提取数据,并更新UI。onNewIntent之后,将调用onresume。
我希望这能解决你的问题

不,这似乎不起作用。你不是在这里开始玩游戏吗?在我的情况下,似乎我不想启动任何特定的活动,但无论应用程序中当前运行的是什么(我有多个活动,其中任何一个都可以位于堆栈顶部)。出于这个原因,我也不确定FLAG_ACTIVITY_CLEAR_TOP是否应该是解决方案的一部分,因为它基本上会清除堆栈,这是我不想要的。我需要该应用程序返回前台时的状态与按下“主页”时的状态完全相同。此外,当应用程序不在前台时,这仍然会导致onCreate()。是的,这是PlayerActivity中的onPause代码,因此它会启动PlayerActivity,在另一个活动的onPause中,我会在通知单击中启动另一个活动
notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
        intent = new Intent(getApplicationContext(), PlayerActivity.class);     
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pIntent = PendingIntent.getActivity(getBaseContext(), 0, intent,0);
        NotificationCompat.Builder noti =
                new NotificationCompat.Builder(this)
                .setSmallIcon(android.R.drawable.ic_media_play)
                .setContentTitle("Nepali Music And more")
                .setContentText("Playing");
    noti.setContentIntent(pIntent);
    noti.setAutoCancel(true);
    noti.setOngoing(true);
     Notification notification = noti.getNotification();


        notificationManager.notify(1, notification);