我的主要活动A已经android:launchMode="singleTask"在清单中设置了.现在,每当我从那里开始另一个活动,例如B并按下HOME BUTTON手机上的电话返回到主屏幕,然后再次返回我的应用程序,可以通过按应用程序的按钮或按下HOME BUTTON长按来显示我最近的应用程序不保留我的活动堆栈并直接返回A而不是预期的活动B.
这里有两个行为:
Expected: A > B > HOME > B
Actual: A > B > HOME > A (bad!)
Run Code Online (Sandbox Code Playgroud)
有没有我缺少的设置或这是一个错误?如果是后者,在修复错误之前是否有解决方法?
我正在开发的应用程序在第一次安装时有一种奇怪的行为.如果用户第一次正常退出应用程序,它将永远按预期运行.如果用户在安装应用程序后第一次使用主页按钮,它会将应用程序视为应该再次重新启动主屏幕并在旧版本之前启动新版本的活动.
所以手头有两个问题.我似乎无法解决这两个问题.
我没有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) 是否可以配置Android应用程序,以便如果用户已打开您的应用程序,启动了大量活动,然后返回主屏幕并再次重新启动您的应用程序,而不是进入主要活动,他们将转而采取最高活动在堆栈上(您应用中的最新活动)?
我正在(最后)编写关于我书的任务的章节,我遇到了一些挥之不去的谜题.
作为主屏幕发射器的东西似乎使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED启动请求的启动器活动时的组合:
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
文档FLAG_ACTIVITY_RESET_TASK_IF_NEEDED包含:
如果设置,并且此活动要么在新任务中启动,要么将现有任务置于顶部,那么它将作为任务的前门启动.这将导致应用任务所需的任何关联性,以使该任务处于适当的状态(将活动移入或移出),或者仅在需要时将该任务重置为其初始状态.
那不是特别清楚.
特别是,它似乎是相同的效果将使用的组合可以看出FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP.引用文档FLAG_ACTIVITY_CLEAR_TOP:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为一个新的意图......
当前运行的[所需活动]实例将在其onNewIntent()方法中接收您从此处开始的新意图,或者本身已完成并使用新意图重新启动.如果它已将其启动模式声明为"多个"(默认值)并且您没有在同一意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建; 对于所有其他启动模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的onNewIntent().
该FLAG_ACTIVITY_CLEAR_TOP文档是有道理的,至少对我来说.
那么,这FLAG_ACTIVITY_RESET_TASK_IF_NEEDED与FLAG_ACTIVITY_CLEAR_TOPand 的组合FLAG_ACTIVITY_SINGLE_TOP有何不同?
如果您可以解释FLAG_ACTIVITY_CLEAR_TASK与上述其他两个选项中的任何一个不同的加分点.
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务.也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成.这只能与FLAG_ACTIVITY_NEW_TASK一起使用.
这和FLAG_ACTIVITY_CLEAR_TOP| 之间有一个明显的区别 FLAG_ACTIVITY_SINGLE_TOP是FLAG_ACTIVITY_CLEAR_TASK需要的FLAG_ACTIVITY_NEW_TASK.但是,除此之外,看起来净效果是相同的,也是匹配的FLAG_ACTIVITY_RESET_TASK_IF_NEEDED.
场景:
我通过单击图标,执行某些操作,浏览活动,通过单击主页按钮暂停应用程序来打开我的应用程序.
情况1:
如果我再次单击图标打开我的应用程序,应用程序将从第一个活动重新启动.
案例2:
如果我从最近打开的应用程序打开我的应用程序(在4.0中通过按菜单按钮并选择我的应用程序),它将从暂停状态开始.
我希望行为2始终发生,不希望我的应用程序每次通过单击图标打开时重新启动.
我将我的清单文件与其他应用程序进行了比较,它们与我的相似,但表现不一样(例如我想要的第二种情况).
编辑:
这里有人问过:应用程序在启动器中按图标按下时完全重启
但没有答案:(
我正在研究大型项目,因此有一些逻辑可以保存应用程序状态,然后在它来自后台时打开正确的活动(片段).但无论如何,我发现如果用户浏览我的应用程序然后将其最小化 - 在以下情况下,android会以不同方式从后台打开它:
那么,通过这两种方式从后台启动应用程序有什么区别?我一直认为,它是相同的机制,但显然,我错了.
谢谢你的回答
当从应用程序图标启动时,我正在寻找一些关于返回到上次打开的活动的建议。但仍有一些副作用需要处理。
LauncherActivity 是监听的入口活动
<activity
android:name="com.app.ui.LauncherActivity"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="nosensor">
<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)
然后是另一个第二个活动和第三个活动。
我的情况如下:
1. LauncherActivity -> SecondActivity
2. SecondActivity -> ThirdActivity (When launching ThirdAcitivity, SecondActivity will finish itself)
Run Code Online (Sandbox Code Playgroud)
所以当在 ThirdActivity 时,用户单击主页键。如果应用程序是从recentTask 打开的,则将显示上次打开的ThirdActivity。这是我想要的行为。
但是当从应用程序图标快捷方式打开应用程序时,它会转到 LauncherActivity。但我希望它与recentTask 的行为相同。如果最后打开的 ThirdActivity 没有被销毁,那么它应该显示这个而不是 LauncherActivity。
但是,如果应用程序强制停止然后重新启动或ThirdActivity 被销毁,则无需返回到ThirdActivity。回到 LauncherActivity 就OK了。
我一直在寻找解决方案。将最后一个活动保存到 sharedPreference 的建议不适合我的情况。
我想知道如何从最近的任务中实现类似的启动。有没有人可以指导一下。非常感谢。