gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:47 24 4
gpt4 key购买 nike

我想从通知开始 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com