我无法让TaskStackBuilder正常工作。
当用户点击我的程序中的通知时,他们会被带到之前从我的应用主屏幕打开的屏幕。我希望用户通过屏幕上的主页按钮和后退按钮将用户带到我应用的主屏幕。
相反,按Home键或后退键完全退出我的应用程序。
我已经阅读了相关的开发人员文档,并认为我已经跟随他们并在此处和其他地方做了更多的研究,但(显然)我一定错过或误解了一些东西。我很感激任何人可能提供的任何指导。
为了帮助自学Android编程,我正在开发一个简单的程序来跟踪和显示用户跑步或步行的路线。该程序的入口点是一个Activity,它承载一个ListFragment,显示用户的运行并显示一个允许创建新运行的选项菜单。
单击列表项或选择选项菜单项将启动第二个活动,该活动承载显示特定运行详细信息的单个片段。从该片段开始,用户可以开始跟踪该运行。
当跟踪开始时,应用程序会启动跟踪正在进行的通知。单击通知会将用户返回到正在跟踪的运行的片段。
当用户从主ListFragment导航到RunFragment时,Home按钮和后退键按预期工作 - 用户返回到主ListFragment。
但是,当用户通过单击通知进入RunFragment时,单击“主页”按钮或后退按钮将完全退出应用程序。
我试图使用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>
以下是RunFragment.java的摘录,该类实现了单个运行的详细信息的显示,以及用户在单击通知时带到的详细信息。
首先,onCreate()
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
if (NavUtils.getParentActivityName(getActivity()) != null) {
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
setHasOptionsMenu(true);
...
}
接下来,onOptionItemSelected()
:
@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);
}
}
最后,代码创建通知并设置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());
}
感谢所有与我共同生活的人。任何关于我出错的提示都将不胜感激!