Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中按下后退按钮时,TaskStackBuilder将退出应用程序_Android_Android Fragments_Notifications - Fatal编程技术网

android中按下后退按钮时,TaskStackBuilder将退出应用程序

android中按下后退按钮时,TaskStackBuilder将退出应用程序,android,android-fragments,notifications,Android,Android Fragments,Notifications,我无法让TaskStackBuilder正常工作 当用户单击来自我的程序的通知时,他们将被带到以前从我的应用程序主屏幕打开的屏幕。我希望通过通知将用户带到屏幕上的Home(主页)按钮和back(返回)按钮将用户带到我的应用程序主屏幕。 相反,按Home(主页)按钮或back(返回)键将完全退出我的应用程序 我已经阅读了相关的开发人员文档,认为我已经遵循了它们,并在这里和其他地方做了额外的研究,但是(显然)我肯定错过了或误解了什么。我非常感谢任何人提供的指导 为了帮助自己学习Android编程,我

我无法让TaskStackBuilder正常工作

当用户单击来自我的程序的通知时,他们将被带到以前从我的应用程序主屏幕打开的屏幕。我希望通过通知将用户带到屏幕上的Home(主页)按钮和back(返回)按钮将用户带到我的应用程序主屏幕。
相反,按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());
}