当我使用Android市场上的"打开"按钮启动时,我在应用程序中遇到了一个错误.似乎从市场上推出它会使用不同的意图,然后从手机的应用程序菜单中启动它.这导致启动相同活动的多个副本,这些副本彼此冲突.
例如,如果我的应用程序包含ABC活动,则上述问题可能会导致堆栈ABCA.
我尝试使用Intent所有活动来解决这个问题,但每当我点击HOME时,它都会产生不必要的副作用,即将活动堆栈清除为root.
示例: ABC - > HOME - > A当我需要的是ABC - > HOME - > ABC
在使用HOME时,是否有一种防止启动相同类型的多个活动而不重置根活动的好方法?
我正在开发的应用程序在第一次安装时有一种奇怪的行为.如果用户第一次正常退出应用程序,它将永远按预期运行.如果用户在安装应用程序后第一次使用主页按钮,它会将应用程序视为应该再次重新启动主屏幕并在旧版本之前启动新版本的活动.
所以手头有两个问题.我似乎无法解决这两个问题.
我没有launchMode将清单文件中的属性定义为任何内容.因此,不应该有任何奇怪的行为.我现在已经尝试launchmode了应用程序的属性,看看我是否能够按照预期的方式运行它,但是这里似乎还有更多的东西,而不仅仅是正确地启动活动.当我按下主页按钮时,应用程序应该第一次关闭自己是没有理由的.
我也没有onUserLeaveHint 在应用程序中使用.通过对项目进行搜索,我必须再次确定.所以似乎根本没有尝试覆盖主页按钮.
即使重新启动手机,主页按钮也会再次正常运行.不确定是什么原因导致初始安装将主页按钮视为从头开始启动应用程序的标志.
一旦用户第一次退出应用程序,问题就会永久解决.关于我应该在哪里看的任何想法?
最近在应用程序中进行了一次搜索,以查看是否它只是因为onUpgrade()SQLite数据库方法的一个组件导致一些奇怪的行为而触发.
@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
}
}
Run Code Online (Sandbox Code Playgroud)
或者在另一个可能触发清单文件更新的位置,如果我将新版本的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" …Run Code Online (Sandbox Code Playgroud) 熟悉的场景:我有一个Main活动,在按下按钮时启动游戏活动.如果用户按下HOME,然后再次启动我的应用程序,则应该显示Game活动,这是他在使用应用程序时最后所做的事情.
但是,相反的是他再次获得Main活动.我觉得Android正在创建另一个 MainActivity实例并将其添加到该应用程序的堆栈中,而不是仅仅选择顶部的任何内容,因为如果我在重新启动应用程序后按BACK,我会进入游戏活动!并且每次调用Main.onCreate方法,而不是调用GameActivity.onResume.
我AndroidManifest.xml几乎是'骨头':
<activity android:name="MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="GameActivity" android:label="@string/app_name">
</activity>
Run Code Online (Sandbox Code Playgroud)
如你所见,没有什么太花哨的.
这就是新活动的推出方式,也非常简单:
Intent intent = new Intent(this, GameActivity.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
从理论上说,这应该在Android中起到"开箱即用"的作用,因为一个非常相似的问题的答案是:在Android中维护标准应用程序活动后备堆栈状态(使用singleTask启动模式),但事实并非如此.
我一直在阅读和重读有关活动和任务和堆栈的文档,并在SO中浏览所有相关的答案,但我不明白为什么这么简单的设置不能按预期工作.
我正在自己更换家用发射器,并且工作正常,但有一件事困扰着我。当我按下Home键时,当前的Home活动(在清单中定义为main / defualt / launcher / home)将重新启动-当前活动实例onpause被执行,并且oncreate被再次触发,因此启动了新活动。
另一方面,ADW启动器和LauncherPRo的行为不一样-我的情况没有刷新。Launcher Pro甚至可以执行以下操作:
任何想法如何做到这一点?
我只是从头开始做了一个非常简单的原型,只有一个活动(在清单中定义为main / defualt / launcher / home),我看到的是同一件事-如果按Home键,它将重新创建。