使用保留/创建活动堆栈重定向到活动

时间:2018-01-16 08:55:37

标签: java android android-intent android-activity android-notifications

我想从通知开始活动。我想开一个活动,这是其他一些活动的继承者。

示例活动:IntroActivity - > Photos - > SpecificPhoto。我想要实现的目标:如果用户点击通知,我想打开SpecificPhoto活动。请注意,该应用可以正在运行(例如显示PhotosActivity),也可以关闭。

  • 我想保留后退按钮功能(按下后移至PhotosActivity)。
  • 点击通知后,我需要启动IntroActivity,因为如果不是,用户需要在此处登录。

我尝试过(使用活动中的常量,code):

PhotosActivity onCreate上: redirectToActivity();

RedirectToActivity方法:

private void redirectToActivity() {
    Intent intent = getIntent();
    int activityCode = intent.getIntExtra("code", 0);

    switch (activityCode) {
        case SpecificPhotoActivity.CODE:
            startActivity(new Intent(this, SpecificPhotoActivity.class));
            break;
        default:
            return;
    }
}

通过应用这种方法,我可以遍历整个活动堆栈并转到我想要的活动。但是,这种方法并不适用于所有情况。有时,activity_code未设置(不知道原因),因此我们在第一个活动中结束。

有没有更专业的方法来解决这个问题?我相信在许多应用程序中必须以某种方式解决这个问题。

1 个答案:

答案 0 :(得分:2)

您想要的是TaskStackBuilder

以下是如何构建意图,导航到SpecificPhotoActivity


    Intent action = new Intent(context, SpecificPhotoActivity.class);

    PendingIntent pendingIntent = TaskStackBuilder.create(context)
            .addNextIntentWithParentStack(action)
            .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

为了正确指定活动堆栈,您应该在清单文件中提供android:parentActivityName

<application ...>
    <activity android:name=".SpecificPhotoActivity"
        android:parentActivityName=".PhotosActivity"/>
</application>

您已指定此参数,SpecificPhotoActivity的父级为PhotoActivity,因此只要在TaskStackBuilder内单击后退按钮,SpecificPhotoActivity就会了解导航的位置

通知的构建应如下:


    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle(...)
            .setContentText(...)
            .setSmallIcon(...)
            .setContentIntent(pendingIntent)
            .build();

    manager.notify(NOTIFICATION_ID, notification);

现在点击通知会打开SpecificPhotoActivity。单击后退按钮将导航到PhotosActivity

剩下的是授权处理。我想您可以在构建通知期间理解用户是否被授权。因此,以下方法应该有效:


    PendingIntent pendingIntent = null;
    if (authorized) {
        Intent action = new Intent(context, SpecificPhotoActivity.class);

        pendingIntent = TaskStackBuilder.create(context)
                .addNextIntentWithParentStack(action)
                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    } else {
        Intent action = new Intent(context, IntroActivity.class);
        action.putExtra("photos_flow", true);
        pendingIntent = PendingIntent.getActivity(context, 0, action, 0);
    }

现在,成功授权后在IntroActivity内:


    void onAuthorized() {
        if(getIntent().getBooleanExtra("photos_flow", false)) {
            // most possibly you should pass some id into SpecificPhotoActivity's intent
            Intent[] intents = new Intent[]{new Intent(this, PhotosActivity.class), new Intent(this, SpecificPhotoActivity.class)};
            startActivities(intents);
            finish();
        }
    }