【问题标题】:Redirect to activity with preserving/creating activity stack使用保留/创建活动堆栈重定向到活动
【发布时间】:2018-01-16 08:55:36
【问题描述】:

我想从通知开始活动。我想打开一个活动,它是其他一些活动的后续活动。

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

  • 我想保留返回按钮的功能(在返回时移动到PhotosActivity)。
  • 点击通知时,我需要启动IntroActivity,因为用户需要在这里登录以防万一。

我尝试了以下操作(在活动中使用常量,code):

开启PhotosActivityonCreateredirectToActivity();

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 没有设置(不知道为什么),因此我们以第一个活动结束。

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

【问题讨论】:

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


    【解决方案1】:

    你想要的是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(); } }

    【讨论】:

    • 如果我像你说的那样指定 android:parentActivityName,我需要对堆栈链中的所有活动都这样做。但是,如果我将 IntroActivity 作为启动器活动,那么为 PhotosActivity 指定 android:parentActivityName 并不是一个好主意,因为在按下后我不想从 PhotosActivity 转到/返回到 IntroActivity。
    • 您确实不需要需要为PhotosActivity指定parentActivityName,因为您确实不需要需要将任何活动视为其父项.
    • 现在可以使用了!问题是我将一些标志设置为意图:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); .各位,在设置标志时要小心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多