android中按下后退按钮时,TaskStackBuilder将退出应用程序
我无法让TaskStackBuilder正常工作 当用户单击来自我的程序的通知时,他们将被带到以前从我的应用程序主屏幕打开的屏幕。我希望通过通知将用户带到屏幕上的Home(主页)按钮和back(返回)按钮将用户带到我的应用程序主屏幕。android中按下后退按钮时,TaskStackBuilder将退出应用程序,android,android-fragments,notifications,Android,Android Fragments,Notifications,我无法让TaskStackBuilder正常工作 当用户单击来自我的程序的通知时,他们将被带到以前从我的应用程序主屏幕打开的屏幕。我希望通过通知将用户带到屏幕上的Home(主页)按钮和back(返回)按钮将用户带到我的应用程序主屏幕。 相反,按Home(主页)按钮或back(返回)键将完全退出我的应用程序 我已经阅读了相关的开发人员文档,认为我已经遵循了它们,并在这里和其他地方做了额外的研究,但是(显然)我肯定错过了或误解了什么。我非常感谢任何人提供的指导 为了帮助自己学习Android编程,我
相反,按Home(主页)按钮或back(返回)键将完全退出我的应用程序 我已经阅读了相关的开发人员文档,认为我已经遵循了它们,并在这里和其他地方做了额外的研究,但是(显然)我肯定错过了或误解了什么。我非常感谢任何人提供的指导 为了帮助自己学习Android编程,我正在开发一个简单的程序,跟踪并显示用户的跑步或步行路线。该程序的入口点是一个活动,它承载一个显示用户跑步记录的列表片段,并显示一个允许创建新跑步记录的选项菜单。
单击列表项或选择选项菜单项将启动第二个活动,该活动承载一个显示特定运行详细信息的片段。从该片段中,用户可以开始跟踪该运行。 开始跟踪时,应用程序会发出跟踪正在进行的通知。单击通知会将用户带回正在跟踪的运行片段 当用户从home ListFragment导航到RunFragment时,home按钮和back键按预期工作-用户将返回home ListFragment。
但是,当用户通过单击通知到达RunFragment时,单击Home按钮或back按钮将完全退出应用程序。
我曾尝试使用TaskStackBuilder建立一个合成后堆栈来解决这个问题,但没有成功 以下是相关代码: AndroidManifest.xml的摘录:
<activity
android:name=".RunListActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".RunActivity"
android:label="@string/app_name"
android:parentActivityName=".RunListActivity">
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".RunListActivity"/>
</activity>
接下来,onOptionItemSelected()
:
最后,创建通知和设置TaskStackBuilder的代码,这无疑是问题所在:
private void createNotification() {
Notification.Builder mBuilder =
new Notification.Builder(getActivity())
.setSmallIcon(android.R.drawable.ic_menu_report_image)
.setContentTitle(getString(R.string.notification_title))
.setContentText(getString(R.string.notification_text));
//Create an explicit Intent for RunActivity with an Extra to
//select the run that's being monitored
Intent runActivityIntent = new Intent(getActivity(), RunActivity.class);
runActivityIntent.putExtra(RunActivity.EXTRA_RUN_ID, mRun.getId());
//The stack builder object should create an artificial back stack for
//RunActivity so that when navigating back from the RunFragment we're
// viewing we'll go to the RunListFragment instead of the Home screen
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getActivity());
stackBuilder.addNextIntentWithParentStack(runActivityIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager.notify(0, mBuilder.build());
}
感谢所有和我一起走到这一步的人。任何关于我哪里出错的提示都将不胜感激 我也有这个问题。据我所知,它并不能在所有android api级别上正常工作。我不能用棒棒糖来制作我的Galaxy S5。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent runListActivityIntent = NavUtils.getParentActivityIntent(getActivity());
if (NavUtils.shouldUpRecreateTask(getActivity(), runListActivityIntent)) {
TaskStackBuilder.create(getActivity())
.addNextIntentWithParentStack(runListActivityIntent)
.startActivities();
return true;
}
if (NavUtils.getParentActivityName(getActivity()) != null) {
NavUtils.navigateUpFromSameTask(getActivity());
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
private void createNotification() {
Notification.Builder mBuilder =
new Notification.Builder(getActivity())
.setSmallIcon(android.R.drawable.ic_menu_report_image)
.setContentTitle(getString(R.string.notification_title))
.setContentText(getString(R.string.notification_text));
//Create an explicit Intent for RunActivity with an Extra to
//select the run that's being monitored
Intent runActivityIntent = new Intent(getActivity(), RunActivity.class);
runActivityIntent.putExtra(RunActivity.EXTRA_RUN_ID, mRun.getId());
//The stack builder object should create an artificial back stack for
//RunActivity so that when navigating back from the RunFragment we're
// viewing we'll go to the RunListFragment instead of the Home screen
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getActivity());
stackBuilder.addNextIntentWithParentStack(runActivityIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager.notify(0, mBuilder.build());
}