2013-04-20 33 views
41

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

我在网上搜索了其他人有这个问题,有几个,但没有人有过坚实的答案,为什么发生在他们身上。在旧的问题中,已经提出将launchmode设置为清单文件中的singletask或singleinstance,但这对我没有帮助,而且 - 据我所知,android的默认行为是返回到任务的前一个状态在这种情况下,所以我不知道为什么我需要特殊的清单选项才能做到这一点。

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

+1

因此,显然如果我重新启动安装该应用程序的设备,则此问题将不复存在。现在,这是很酷的一切,但在我的应用程序的情况下,如果用户在下载电话之前重新启动手机,它仍然会非常恼人。 – LayfieldK 2013-04-21 00:06:44

+0

你能提供一个堆栈跟踪或日志吗? – TryTryAgain 2013-04-21 00:16:25

+1

不,它只发生在我使用该应用的发布版本时,所以我没有堆栈跟踪或日志。 – LayfieldK 2013-04-21 10:34:00

回答

26

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

+0

谢谢!它的工作原理 – gayavat 2016-09-05 20:21:00

+1

如果我们想用不同的数据打开两次相同的活动,这种方法很危险。 – hkaraoglu 2016-11-08 08:10:50

+2

如果你想用不同的数据打开同一个活动,你可以在onNewIntent()中处理。 – Tasneem 2017-03-02 06:03:42

0

在Android中按下后退按钮时,会调用onDestroy方法(与按下主页按钮相反,其中只有onPause()方法被调用)。

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

+1

我按主页按钮退出应用程序。 – LayfieldK 2013-04-21 10:33:24

3

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

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

到目前为止,我发现这是一个问题,根据您如何在实际的设备安装,具体包括:

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

如果安装使用下列选项之一吧,这个问题不会出现:

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

    adb install <FILE PATH OF .APK FILE> 
    

    在Linux中输入:

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

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

更新:

我发现了一个解决方案。按照这两个步骤:

  1. 套装android:launchMode="singleTask" = trueAndroidMainifest.xml您的应用程序的活动标签内的所有活动。
  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;  
        } 
    } 
    

此行为是Android的一个bug。不是特例。

+1

我不会推荐这个。 launchMode不应该被设置。它必须有一个目的,因为它可能会导致奇怪的行为(说出体验;)) – Boy 2015-04-23 08:12:59

+0

如果你的应用程序支持Pin锁等功能,当你想设置android:launchMode =“singleTask”时应该仔细对待它。 – 2015-08-13 03:51:16

+0

谢谢。你让我今天一整天都感觉很好! – 2016-12-22 21:24:30

4

你可以在使用launchMode为singleTop的启动活动的AndroidManifest.xml

0

添加到您的第一项活动:

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

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

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

0

对我来说,修复程序添加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)] 
0

你可以尝试设置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

0
// 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之前。这将解决问题

相关问题