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