java - 通过保留/创建 Activity 堆栈重定向到 Activity

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

我想从通知开始 Activity 。我想开展一项 Activity ,它是其他一些 Activity 的继承者。

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

  • 我想保留后退按钮功能(在按下后移到 PhotosActivity)。
  • 在点击通知时,我需要启动 IntroActivity,因为用户需要在这里登录以防他没有登录。

我试过以下(在 Activity 中使用常量,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 堆栈并转到我想要的 Activity 。但是,这种方法并非在所有情况下都有效。有时,activity_code 未设置(不知道为什么),因此我们在第一个 Activity 中结束。

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

最佳答案

你要的叫TaskStackBuilder .

以下是您应该如何构建将导航到 SpecificPhotoActivity 的 Intent :


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

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

In order to correctly specify stack of activities, you should provide android:parentActivityName inside manifest file:

<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();
        }
    }

关于java - 通过保留/创建 Activity 堆栈重定向到 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48277341/

相关文章:

java - 用 Scala 继承 'object'

java : convert List of Bytes to array of bytes

android - 如何在 Android API 低于 20 的 Android Studio 上运行代码?

java - 如何从 build.gradle 文件运行 WSDLToJava?

安卓定时器泄露

安卓 Stripe 集成

java - 使用 Navigation 包中的 startActivity

android - 首次启动时的自定义 Activity (初始化向导)

java - 无法解决android中的错误?

Java拒绝public static void main方法,请求public static void main方法