我想从通知开始活动。我想开一个活动,这是其他一些活动的继承者。
示例活动: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
未设置(不知道原因),因此我们在第一个活动中结束。
有没有更专业的方法来解决这个问题?我相信在许多应用程序中必须以某种方式解决这个问题。
答案 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();
}
}