Android fragments 如何在重新打开应用程序时显示最后一个可见片段

Android fragments 如何在重新打开应用程序时显示最后一个可见片段,android-fragments,android-activity,Android Fragments,Android Activity,以下是我的用例: 用户单击应用程序图标->主活动->第一活动->第二活动 SecondActivity有三个片段,即F1、F2、F3 假设用户在SecondActivity中处于F1位置,现在如果用户通过按home按钮最小化应用程序,然后不使用应用程序图标而是通过从长按显示的列表中选择重新启动应用程序(不知道其技术名称) 我已经探讨了大多数问题,甚至尝试了以下方法 (但如果我想从应用程序图标(即从启动器)重新启动我的应用程序,这似乎是可行的): 以下是我的活动和片段生命周期方法调用日志: 当我

以下是我的用例:

用户单击应用程序图标->主活动->第一活动->第二活动

SecondActivity有三个片段,即F1、F2、F3

假设用户在SecondActivity中处于F1位置,现在如果用户通过按home按钮最小化应用程序,然后不使用应用程序图标而是通过从长按显示的列表中选择重新启动应用程序(不知道其技术名称)

我已经探讨了大多数问题,甚至尝试了以下方法

(但如果我想从应用程序图标(即从启动器)重新启动我的应用程序,这似乎是可行的):

以下是我的活动和片段生命周期方法调用日志:

当我最小化应用程序时:

  • E/第二次活动﹕ 暂停呼叫
  • E/F1﹕ 暂停
  • E/F1﹕ OnSaveInstanceState
  • E/SecondActivity在顶部调用
重新打开应用程序时:

  • E/第一次活动﹕ 重新启动呼叫
  • E/第一次活动﹕ onStart呼叫
  • E/第一次活动﹕ 我打电话给你
  • E/第二次活动﹕ onDestroy呼叫
  • E/F1﹕ 分离
  • E/第一次活动﹕ 暂停呼叫
  • E/第一次活动﹕ 上台呼叫
根据我的理解,这应该如下所示:

  • 在暂停SecondActivity时,我需要将当前可见片段保存在shared pref中
  • 在SecondActivity的Resume上,我需要使用fragmentManager提取片段名称并显示它
但在重新打开应用程序后,不会调用my SecondActivity onResume,而是调用FirstActivity的onRestart,调用SecondActivity的onRestart(如上所示)

在尝试了很多选择并阅读了一些SO解决方案之后,我无法解决这个问题

请建议,如何处理,提前谢谢

编辑:

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".controller.ApplicationLoader"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:alwaysRetainTaskState="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".RegistrationActivity"
            android:label="@string/title_activity_registration"
            android:noHistory="true"
            android:screenOrientation="portrait"/>
        <activity
            android:name=".HomePageActivity"
            android:label="@string/title_activity_home_page"
            android:noHistory="true"
            android:screenOrientation="portrait">

            <!--
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            -->
        </activity>

        <service
            android:name=".services.BgService"
            android:exported="false"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.example.bgapp.BackgroundService" />
            </intent-filter>
        </service>

        <receiver android:name=".services.BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity android:name=".ProductOverviewActivity"
            android:screenOrientation="portrait">
        </activity>

        <receiver android:name=".receivers.SmsReceiver"
            android:screenOrientation="portrait">
            <intent-filter android:priority="99999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>

        </receiver>

    <!-- Intent service -->
        <service
            android:name=".services.WService"
            android:exported="false" />

        <service android:name=".services.VerifyService" android:exported="false"/>


    </application>

</manifest>

您的问题在于使用:

 android:noHistory="true"
在注册活动上。用户按HOME键后,
RegistrationActivity
即完成。以下是对
noHistory
文档的引用:


值“true”表示活动不会留下历史痕迹。它将不会保留在任务的活动堆栈中,因此用户将无法返回到它。

您是如何第一次启动应用程序的?从IDE(如Android Studio、Eclipse、IntelliJ)或安装程序,或从主屏幕或可用应用程序列表中选择图标?感谢您的回复。我已经验证了通过Android Studio运行和直接生成并安装应用程序。甚至我也试过调试,但没有得到具体的结果。提前谢谢。根据要求,我已附上舱单。此处SplashActivity是主要活动,ProductOverview活动是第一个活动,RegistrationActivity是第二个活动。RegistrationActivity有3个片段,我想继续使用RegistrationActivity,但它将用于ProductOverviewActivity非常感谢David找到了根本原因,这就是问题所在。非常感谢你及时的帮助。