重新启动“主页”button上的“活动”,但只有第一次

我正在开发的应用程序在第一次安装时有一个奇怪的行为。 如果用户第一次正常退出应用程序,它将永远像它应该那样运行。 如果用户在安装应用程序后第一次使用homebutton,它会将应用程序视为应该重新启动主屏幕,并在旧应用程序的前面启动新版本的活动。

所以手头确实有两个问题。 我似乎无法解决他们两个。

  1. 当应用程序首次安装在用户点击homebutton时,保持应用程序不closures。
  2. 保持应用程序的多个版本在启动时不会启动(launchMode在这里有所帮助,但是第一个组件仍然触发)。

我没有定义清单文件中的launchMode属性。 所以不应该有任何奇怪的行为。 我现在已经尝试了应用程序的launchmode属性,看看我是否能够按照预期的方式来实现它,但是在这里似乎不仅仅是正确地启动活动。 没有理由应用程序应该首次closures,只要按下homebutton就可以看到。

我不在应用程序中使用onUserLeaveHint 。 我必须再次通过search这个项目来确定。 所以似乎没有任何压倒性的主页button的重写。

即使在重新启动电话之后,主页button仍会正常运行。 不知道是什么原因导致初始安装将主页button作为标志来从头开始应用程序。

一旦用户第一次退出应用程序,问题将永久解决。 任何想法,我应该看看?

最近在应用程序中进行了一次search,看看它是否会触发,因为SQLite数据库方法的onUpgrade()组件导致了一些奇怪的行为。

 @Override public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { } } 

或者在另一个可能会触发清单文件更新的位置,如果我正在将新版本的APK传递给已经有一个版本的设备,它已经比当前版本低。 然而,这部分代码没有任何东西让我相信它会影响与启动顺序有关的任何事情。

清单文件(名称已更改)在下面提供了应用程序当前正在使用的内容。

 <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="com.android.vending.CHECK_LICENSE"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.VIBRATE" android:required="false"/> <uses-permission android:name="android.permission.CAMERA" android:required="false"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <application android:icon="@drawable/icon" android:label="@string/app_name" android:allowBackup="false" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" > <activity android:name=".MyMain" android:label="@string/app_name_with_version" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan" /> <activity android:name=".StartupActivity" android:label="@string/app_name" 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=".SelectActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait"/> <activity android:name=".ImageSelectionActivity" android:theme="@android:style/Theme.Dialog" android:label="@string/app_name_with_version" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden"/> <activity android:name=".DetailsActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait"/> <activity android:name=".EMailActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait"/> <activity android:name=".SendTo" android:label="@string/share_label" android:theme="@android:style/Theme.Dialog" > <INTENT-FILTER> <ACTION android:name="android.intent.action.MAIN"> <CATEGORY android:name="android.intent.category.LAUNCHER"/> <INTENT-FILTER> <ACTION android:name="android.intent.action.VIEW"> <CATEGORY android:name="android.intent.category.DEFAULT"> <CATEGORY android:name="android.intent.category.BROWSABLE"> <DATA android:scheme="callback" android:host="twitter"/> </CATEGORY> </CATEGORY> </ACTION> </INTENT-FILTER> </ACTION> </INTENT-FILTER> </activity> <activity android:name=".CreateMyActivity" android:label="@string/create_account_label" android:screenOrientation="portrait" android:theme="@android:style/Theme.Dialog"/> <activity android:name=".ViewInLayoutActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait"/> <activity android:name=".Preferences" android:label="@string/set_preferences" android:screenOrientation="portrait" android:theme="@android:style/Theme.Dialog"/> <activity android:name=".AboutActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait"/> <activity android:name=".InteractiveActivity" android:label="@string/app_name_with_version" android:screenOrientation="portrait" android:theme="@android:style/Theme.Dialog"/> <activity android:name=".AlertFailedCommunications" android:screenOrientation="portrait" android:label="@string/alert_account_label" android:theme="@android:style/Theme.Dialog"/> </application> 

欢迎来到不断增长的被这个人咬了的用户名单。

这是一个众所周知和长期存在的Android错误 。 从应用程序第一次从安装程序,Web浏览器和IDE(IntelliJ,Eclipse等)启动的方式。 看到很久以前提出的有关这个问题的这些问题:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

它仍然是坏的,你不能防止这种情况发生。 您唯一能做的就是检测Android何时启动了根活动的第二个实例到现有任务中 。 你可以通过把这个代码放在你的根活动的onCreate()中来做到这一点:

 if (!isTaskRoot()) { // Android launched another instance of the root activity into an existing task // so just quietly finish and go away, dropping the user back into the activity // at the top of the stack (ie: the last state of this task) finish(); return; } 

为什么这是行为,没有线索。 但我知道自定义Launcher具有特定的launchModes设置。

例如ADW.Launcher:

 android:clearTaskOnLaunch="true" android:launchMode="singleTask" 

Android SDK示例中的Home应用程序: android-sdk\samples\android-16\Home\AndroidManifest.xml

 android:launchMode="singleInstance" 

引用CommonsWare: 如何防止自定义主页启动器应用程序重新启动活动?

我正在使用来自SDK的Home示例应用程序,它使用singleInstance。 奇怪的是,AOSP发射器使用singleTask

看起来问题是由应用程序的不同实例引起的。 当用户点击应用程序图标时,可能第一个实例是在安装程序的任务下启动的,第二个实例是在自己的任务下。 他/她似乎恢复了应用程序,但实际上他在这一刻再次启动。

如果你想让你的应用只在自己的任务中运行,可能的方法是添加

 android:allowTaskReparenting="true" 

到AndroidManifest的应用程序级别。 安装后第一次单击应用程序图标后,应用程序将被移至分离的任务。