87

我正在尝试发布我的第一个 android 应用程序以发送给一些测试人员。但是,我遇到了一个问题。当您退出应用程序,然后通过其图标启动它重新进入它时,它会重新启动整个应用程序,而不是返回到之前的位置。即使您在退出后立即重新进入,也会发生这种情况。但是,如果我按住主页按钮并通过最近的应用程序列表启动它,它就不会发生。

我在网上搜索了其他有这个问题的人,有几个,但没有人对为什么会发生在他们身上有一个可靠的答案。在旧问题中建议在清单文件中将启动模式设置为 singletask 或 singleinstance,但这对我没有帮助,此外 - 据我了解,android 的默认行为是返回到任务的先前状态在这种情况下,所以我不知道为什么我需要特殊的清单选项才能做到这一点。

这个问题最离奇的是,如果我用eclipse和调试器把app放到手机上,就不会出现这个问题。我什至不需要连接到调试器,似乎只要我有应用程序的调试版本,问题就不会发生。但是,如果我使用发布版本(我使用 Eclipse 中的 Android Tools - Export Signed Application Package 菜单选项创建它),就会出现问题。如果有人对造成这种情况的原因有任何见解,我很想听听您的想法。

4

15 回答 15

64

我在应用程序中遇到了同样的问题,我通过添加标志"android:launchMode="singleTop""而不是"android:launchMode="singleTask""<activity>AndroidManifest.xml 文件的声明中解决了这种行为。希望这会对某人有所帮助。

于 2014-02-07T07:58:38.513 回答
34

到目前为止,我发现这是一个基于您如何在真实设备中安装它的问题,特别是:

  1. 如果您只是将 APK 复制并粘贴到设备的本地存储并从设备安装它,无论它是已签名或未签名还是从 bin 文件夹中获取,它都会显示此行为,应用程序从菜单图标重新启动。

如果您使用以下选项之一安装它,则不会出现此问题:

  1. 使用终端或命令提示符转到 sdk/tools/ 然后键入

    adb install <FILE PATH OF .APK FILE>
    

    在 Linux 中,键入:

    ./adb install <FILE PATH OF .APK FILE>
    
  2. 只需从 Eclipse 运行您的项目。

我很高兴知道是否有任何方法可以分发正确的 APK 以进行 beta 测试。我已经尝试导出签名的 APK,因为当您复制和粘贴 APK 并手动安装它时,它会显示流氓行为。

更新:

我找到了解决方案。请遵循以下两个步骤:

  1. 在activity标签内的AndroidMainifest.xmlandroid:launchMode="singleTask" = true中为你应用的所有activity设置。
  2. 将此代码放入您的 Launcher Activity 中onCreate()

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    

此行为是 Android 中的错误。不是特例。

于 2014-12-30T05:07:27.717 回答
10
 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

在调用 setContentView 之前,在您的启动器活动中编写上述代码。这将解决问题

于 2017-11-30T06:07:06.590 回答
8

您可以将 launchMode 用作AndroidManifest.xml中 Launcher Activity 的singleTop

       <activity
        android:name="<YOUR_ACTIVITY>"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
于 2015-08-05T08:53:41.933 回答
4

这是 Android 中的默认行为。对于调试版本,由于某种原因,它的工作方式有所不同。它可以通过添加android:launchMode="singleInstance"到活动中来解决,您希望在从图标启动后重新启动。

于 2013-09-16T17:29:28.287 回答
4

将此添加到您的第一个活动中:

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);
于 2015-10-21T13:36:26.573 回答
3

尝试使用android:alwaysRetainTaskState如下例所示:

<activity
    android:name="com.jsnider.timelineplanner.MainActivity"
    android:alwaysRetainTaskState="true"
    android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
于 2014-02-09T02:24:51.530 回答
3

对我来说,我发现我错误地发布NoHistory = true了我的活动属性

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

这阻止了应用程序恢复到此活动并重新启动

于 2019-07-08T23:18:06.460 回答
2

我在 2019 年的 Android TV 上看到了这个问题。有没有更好的解决方法?以外

if (!isTaskRoot()) {
    finish();
}

它可以工作,但看起来比实际解决方案更像一个黑客。

于 2019-06-19T04:35:48.887 回答
2

您可以尝试android:alwaysRetainTaskState="true"在 AndroidManifest.xml 中为您的启动器活动设置。

    <activity
        android:name=".YourMainActivity"
        android:alwaysRetainTaskState="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

有关详细信息,您可以查看https://developer.android.com/guide/topics/manifest/activity-element.html#always

于 2017-10-17T03:50:42.160 回答
0

我在重新启动应用程序时遇到了问题,我的问题出在主题上:我有不同的片段,我会有一个适合所有人的背景。但这会导致某些设备中的应用程序重新启动(.

我在主题中删除了这一行,这有助于:

项目名称="android:windowBackground">​​@drawable/background /item

于 2021-06-23T08:31:37.700 回答
0

上述所有解决方案在我的所有设备上都无法始终如一地工作。它适用于一些三星,但不是全部。

对我来说问题的原因是手动安装 APK。

于 2016-09-01T09:32:20.150 回答
0

对我来说,修复是LaunchMode = LaunchMode.SingleTop在主 Activity 上添加到我的 Activity 属性:

/// <summary>
    /// The main activity of the application.
    /// </summary>
    [Activity(Label = "SilhuettePhone",
        Icon = "@drawable/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop,
        WindowSoftInputMode = SoftInput.AdjustResize)]
于 2017-10-16T13:28:08.593 回答
0

移除任务关联而不是启动模式在一定程度上起到了一定的作用,因为它有自己的缺点

于 2021-09-26T20:27:26.480 回答
-1

当您在 Android 中按下后退按钮时,将onDestroy调用该方法(与按下主页按钮相反,仅onPause()调用该方法)。

如果您需要您的应用程序从中断处继续,请将应用程序的状态保存在您的方法中,然后在onDestroy()方法中加载该状态onCreate()

于 2013-04-21T00:10:32.917 回答