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

Lay*_*ldK 67 android android-launcher

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

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

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

小智 48

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

  • 如果要使用不同的数据打开相同的活动,可以在onNewIntent()中处理. (5认同)
  • 如果我们要使用不同的数据打开同一活动两次,则此方法很危险。 (2认同)

Jay*_*ora 31

到目前为止,我已经发现,它是一个基于你如何安装它在你的真实设备,具体的问题:

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

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

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

    adb install <FILE PATH OF .APK FILE>
    
    Run Code Online (Sandbox Code Playgroud)

    在Linux中,键入:

    ./adb install <FILE PATH OF .APK FILE>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 只需从Eclipse运行您的项目.

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

更新:

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

  1. 活动代码android:launchMode="singleTask" = true中的AndroidMainifest.xml中设置应用的所有活动.
  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;       
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 我不会推荐这个.不应该只设置launchMode.它必须有一个目的,因为它可能会导致奇怪的行为(谈论经验;)) (2认同)

Fat*_* km 9

 // 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;
        }
Run Code Online (Sandbox Code Playgroud)

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


sup*_*ser 7

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

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

在此处输入图片说明


vas*_*nth 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>
Run Code Online (Sandbox Code Playgroud)