应用程序在启动器中按图标按下时完全重新启动应用程序

时间:2013-04-20 23:55:50

标签: android android-launcher

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

我已经在网上搜索过有这个问题的其他人,而且还有一些,但没有人能够确切地回答为什么会发生这种问题。在旧问题中建议将启动模式设置为清单文件中的singletask或singleinstance,但这对我没有帮助,而且 - 根据我的理解,android的默认行为是返回到任务的先前状态在这种情况下,所以我不知道为什么我需要特殊的清单选项才能做到这一点。

关于这个问题最离奇的是,如果我使用eclipse和调试器将应用程序放在我的手机上,则不会出现此问题。我甚至不需要连接到调试器,似乎只要我有应用程序的调试版本,问题就不会发生。但是,如果我使用发布版本(我使用Eclipse中的Android工具 - 导出签名应用程序包菜单选项创建它),则会出现问题。 如果有人对导致这种情况的原因有任何了解,我很乐意听到你的想法。

15 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:29)

到目前为止,我发现根据您在真实设备中的安装方式存在问题,具体如下:

  1. 如果您只是将APK复制并粘贴到设备的本地存储中并从设备安装,无论是签名还是未签名或从bin文件夹中获取,都会显示此行为,app从菜单图标重新开始。
  2. 如果使用以下选项之一安装它,则不会出现此问题:

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

      adb install <FILE PATH OF .APK FILE>
      

      在Linux中,输入:

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

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

      更新:

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

      1. 活动标记内的 AndroidMainifest.xml 中为您应用的所有活动设置android:launchMode="singleTask" = true
      2. 将此代码放入您的启动器活动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;       
            }
        }
        
      3. 此行为是Android中的错误。不是特例。

答案 2 :(得分:6)

你可以将launchMode作为 singleTop 用于 AndroidManifest.xml中的Launcher Activity

       <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>

答案 3 :(得分:4)

另一个奇怪的原因,仅当通过复制到设备并安装后单击“打开”启动应用程序时,重启才会发生。

在OS8.1上测试,活动中没有launchMode。

enter image description here

答案 4 :(得分:3)

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

答案 5 :(得分:2)

 // 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之前在启动器活动中编写上述代码。这将解决问题

答案 6 :(得分:1)

尝试使用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>

答案 7 :(得分:1)

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

    <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

答案 8 :(得分:0)

在Android中按后退按钮时,会调用onDestroy方法(而不是按主页按钮,只调用onPause()方法)。

如果您的应用需要从停止的位置继续,请在onDestroy()方法中保存应用的状态,并使用onCreate()方法加载该状态。

答案 9 :(得分:0)

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

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);

答案 10 :(得分:0)

上述所有解决方案都不能在我的所有设备上保持一致。它适用于一些三星但不是全部。

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

答案 11 :(得分:0)

对我来说,修复是通过主要活动在我的Activity属性中添加LaunchMode = LaunchMode.SingleTop

/// <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)]

答案 12 :(得分:0)

我在2019年的Android TV上看到了此问题。有更好的解决方法吗?

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

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

答案 13 :(得分:0)

对我来说,我发现自己在活动属性中误贴了NoHistory = true

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

这阻止了应用恢复到该活动并重新启动

答案 14 :(得分:0)

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

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

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