22

从 Android 开发,我通过示例代码实现了一个简单的通知,但是在我的应用程序中,我不想重新创建意图并再次创建活动,我只想回到我的上一个活动(它是一个媒体播放器 UI)。如果我使用示例代码,它将创建一个新活动

Intent resultIntent = new Intent(this, ResultActivity.class);

我评论了有关新意图的相关代码并收到了通知,但不知道如何回到我的上一个活动......

从长按主页键返回我的应用程序并触摸我的应用程序就可以了。我想要的就是这种行为。

bleow 是来自 Android Development 的示例代码,我评论了新的意图部分。

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Hello World!");
/*Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
    stackBuilder.getPendingIntent(
        0,
        PendingIntent.FLAG_UPDATE_CURRENT
    );
mBuilder.setContentIntent(resultPendingIntent);*/
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mId, mBuilder.build());

[更新]

我想我需要为活动的意图和属性设置标志。因此,对于我想回到我设置的活动

android:launchMode="singleInstance"

因为,我不想要一个来自意图的新活动,我只想要我的最后一个活动,所以我添加

Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

从文档中我了解到,使用Pendingintent.contentIntent它必须包含FLAG_ACTIVITY_NEW_TASK标志,并且在使用此标志时,如果您现在开始的活动已经在运行任务,则不会启动新活动;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。所以我还添加

Intent.FLAG_ACTIVITY_NEW_TASK

但是从 logCat 中,我仍然看到,当我触摸返回活动的通知时,pendingintent 仍然调用 onCreate() 函数,而不仅仅是显示仍然“活着”的最后一个活动。

4

5 回答 5

47

如果你想从后台调用 Activity 试试这个:

    Intent intent = new Intent(this, YourLauncherActivity.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            intent, 0);
    mBuilder.setContentIntent(pendingIntent);

如果您在主屏幕上单击通知,则您的应用程序的最后显示的 Activity 将进入前台,而无需重新启动它。如果 Activity 被系统杀死,您将获得一个新的 Activity。

于 2013-08-25T07:40:40.490 回答
3

我使用了 PendingIntent.getActivities 而不是 getActivity。这在我的项目中运行良好。

Intent backIntent = new Intent(this, HomeActivity.class);
                backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent notificationIntent = new Intent(this, NextActivity.class);

                final PendingIntent pendingIntent = PendingIntent.getActivities(this, 1,
                        new Intent[] {backIntent, notificationIntent}, PendingIntent.FLAG_ONE_SHOT);
于 2016-06-07T05:42:56.797 回答
2

对我来说,这有效:

.setContentIntent(
     PendingIntent.getActivity(
     context,
     0,
     new Intent(context, YOUR_MAIN.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP ),PendingIntent.FLAG_ONE_SHOT))   

FLAG_ONE_SHOT:不要创建两次(与 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP 相关联)

于 2018-01-25T13:18:25.700 回答
1

SingleTop模式下,我使用此方法而不明确定义根活动类:

Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(getPackageManager().getLaunchIntentForPackage(getPackageName()).getComponent());

这将从通知中恢复上次活动:

builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));

或者从服务中恢复上一个活动:

try {
    PendingIntent.getActivity(this, 0, intent, 0).send();
} catch (CanceledException e) {
    e.printStackTrace();
}
于 2014-03-04T19:46:15.350 回答
0

代码听到

        Intent resultIntent = new 
 Intent(getApplicationContext(),MainActivity.class);

        resultIntent.putExtra("splash",2);
        resultIntent.putExtra("message","beacons");
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(resultIntent);
        resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent notifyPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationCompatBuilder.setContentIntent(notifyPendingIntent);

    Intent intent = this.getIntent();
    Bundle extras = intent.getExtras();

    if (extras != null) {
        String extraValue = extras.getString("notificationType");

        if(extraValue !=null){
            int value = Integer.parseInt(extraValue);
            if (value == 1) {
                intent = new Intent(SplashActivity.this,MainActivity.class);
                intent.putExtra("splash",value);
                intent.putExtra("message", "fromsplash");
                startActivity(intent);
                finish();
            } else
             if (value == 2){
                 intent = new Intent(SplashActivity.this,MainActivity.class);
                 intent.putExtra("swip","2");
                 intent.putExtra("message", "beacons");
                startActivity(intent);
                finish();
            } 
        } 

    } 
}
于 2020-06-02T13:44:17.953 回答