希望有人可以帮助我弄清楚,如果不是解决方案,至少可以解释一个行为.
问题:
在某些设备上,按启动器图标会导致当前任务恢复,而在其他设备上则会导致初始启动意图被触发(有效地重新启动应用程序).为什么会这样?
细节:
当您按下"启动器图标"时,应用程序会正常启动 - 也就是说,我认为,会Activity使用操作android.intent.action.MAIN和类别以您的第一个名称启动一个Intent android.intent.category.LAUNCHER.但情况并非总是如此:
在大多数设备上,如果在应用程序运行后按下启动器图标,则恢复该进程中当前运行的活动(不是初始Activity).它的恢复方式与从OS菜单中的"Recent Tasks"中选择它的方式相同.这是我想要在所有设备上执行的操作.
但是,在选定的其他设备上会出现不同的行为
在摩托罗拉Xoom上,当您按下启动器图标时,无论当前运行的是什么,应用程序都将始终启动初始启动Activity.我假设启动器图标总是启动"启动器"意图.
在Samsung Tab 2上,当您按下启动器图标时,如果您刚刚安装了应用程序,它将始终启动初始设置Activity(与Xoom相同) - 但是,在安装后重新启动设备后,启动器图标将改为恢复应用程序.我假设这些设备在设备启动时将"已安装的应用程序"添加到查找表中,这允许启动器图标正确地恢复正在运行的任务?
我读过许多回答听起来类似我的问题,但简单地添加android:alwaysRetainTaskState="true"或使用launchMode="singleTop"的Activity不是答案.
编辑:
在最近发布此应用程序后,我们发现在首次重新启动后,所有设备上都会出现此行为.这看起来很疯狂,但通过重启过程,我实际上无法找到出错的地方.
我的活动A与android:launchMode="singleTop"在清单.
如果我去的活动B,C和D在那里我有菜单快捷方式回到我的应用程序根系活力(A).
代码如下所示:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)
但是,不是返回到A我已经存在的实例,MainActivity.class而是创建一个新实例 - >它onCreate()转而不是onNewIntent().
这不是预期的行为,对吗?
我正在开发的应用程序在第一次安装时有一种奇怪的行为.如果用户第一次正常退出应用程序,它将永远按预期运行.如果用户在安装应用程序后第一次使用主页按钮,它会将应用程序视为应该再次重新启动主屏幕并在旧版本之前启动新版本的活动.
所以手头有两个问题.我似乎无法解决这两个问题.
我没有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) 所以我的问题是:
当我按下它时再次带来Sceen2和Screen1.我不使用任何其他意图标志或启动模式.
有人能解释一下发生了什么吗?
我想阻止用户离开我的应用.我试图通过家庭启动器活动/应用程序实现这一点,我不明白android的行为.首次按HOME将始终在新任务中创建新活动,而不是将现有活动移动到前台.当第二次按HOME时,没有任何反应.见例子:
我有一个登录活动(A)和设置活动(B).B从A打开.A被设置为启动器(LAUNCHER,DEFAULT,HOME类别).
当A的launchMode是singleTop,singleTask或standard时,我得到相同的行为.使用singleInstance只有一个A,但B在T1中单独使用,我不希望这样.
为什么总会创建一个新任务?所有intents标志始终设置FLAG_ACTIVITY_NEW_TASK标志.为什么android会这样做?
这与此处或此处发布的行为相同吗?我无法使用该解决方案,因为android创建了一个新任务,因此A将永远是根.(或者我如何检查这是第二个实例?)
我不能在这里发布使用singleInstance,因为我不希望B单独使用(如果A是可见的,它也是唯一的活动和任务(登录目的)).我试图通过ActivityManager删除所有其他任务,但是对于SDK> = 21,我的min是16.getAppTasks()
我甚至无法使用此解决方案,因为我从未意识到FLAG_ACTIVITY_BROUGHT_TO_FRONT标志.始终存在FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标志.
我已经尝试了很多与launchMode,clearTaskOnLaunch,noHistory的组合......但没有成功 - 总是新任务.
不知道怎么解决这个问题?在棒棒糖上运行.谢谢.
android android-intent android-launcher android-homebutton android-task
当我的 android 应用程序第一次启动时FirstActivity。当我点击按钮而FirstActivity不是 start AddTraderActivity。如果我按下按钮“ START REQUEST ”AddTraderActivity然后我打电话:
setResult(RESULT_OK);
finish();
Run Code Online (Sandbox Code Playgroud)
结果AddTraderActivity是破坏和展示FirstActivity。好的。
现在我想为AddTraderActivityTest. 这里测试:
@RunWith(AndroidJUnit4::class)
@SmallTest
class AddTraderActivityTest {
@get:Rule
var addTraderActivity: IntentsTestRule<AddTraderActivity> =
IntentsTestRule(AddTraderActivity::class.java)
@Test
fun toolBarHeight() {
onView(withId(R.id.toolBar))
.check(matches(withHeightResId(R.dimen.tool_bar_height)))
}
@Test
fun buttonStartTextUppercase() {
onView(withId(R.id.startButton))
.check(matches(withTextUppercaseResId(R.string.start)))
}
}
Run Code Online (Sandbox Code Playgroud)
结果当我开始这个测试时,然后只开始AddTraderActivity并测试成功通过。好的。
现在我想为单击按钮“ START REQUEST ”编写测试
这里测试:
setResult(RESULT_OK);
finish();
Run Code Online (Sandbox Code Playgroud)
结果,当测试运行并按下按钮“ START REQUEST ”时,我收到下一个错误:
测试开始于 16:05 ...
$ adb shell am instrument -w -r -e debug false -e …Run Code Online (Sandbox Code Playgroud) 根据Android文档:
http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
"当用户通过按Home键离开任务时,当前活动停止并且其任务进入后台.系统保留任务中每个活动的状态.如果用户稍后通过选择启动器图标恢复任务开始任务时,任务进入前台并恢复堆栈顶部的活动."
如果我理解正确,这意味着:
...对?我想这是正确的行为......
但是,我没有在我的应用程序中看到这一点.
如果我点击"主页按钮"然后恢复我的应用程序,通过按启动器图标,它将从主要活动开始 - 而不是顶部或最新的活动.
我在三星Galaxy Tab Android 2.2.1上编码 - 我在Android清单中有最常见的选项 - 事情是我处理10个不同的活动,具有不同的意图附加 - 以及Dispatcher类方法 - 或保存每个活动状态 - 听起来很苛刻.
我正在使用带有ADT版本12的Eclipse IDE; 我发现了一些非常有趣的东西:
当我从Eclipse IDE运行应用程序时,连接了我的设备,我没有看到这种行为.该应用程序的行为与文档中所述的相同.事实上,我只是在将我的apk部署到Google Play应用程序存储库后才看到这个; 并下载它进行测试.
我的问题是,有没有人找到这种情况发生的真正原因?文档错了吗?还是遗失了什么?这是Android上的错误吗?
我做的另一项研究是:
当我试用我的应用程序,从谷歌播放下载,作为APK,如果我第二次进入我的应用程序,我得到"主要"活动而不是最后一个开放.我按回家.按下主页后,我输入android的应用程序管理设置,找到我的应用程序并单击"强制停止".执行此操作后,应用程序的行为与文档中所述的相同.
有人帮忙!:)
抱歉,如果这似乎是一个重复的问题,因为深层链接导致应用程序的多个实例打开。但是,我认为从评论和答案中,如果没有适当的屏幕截图,我们大多数人都很难理解这个问题。
在您决定将其标记为重复之前,请允许我进一步详细说明这个问题。
有两种方法可以启动我的应用程序
我想要实现的是,无论我如何启动应用程序,无论是通过深层链接还是单击应用程序图标,我都希望任务列表中只显示 1 个应用程序实例。
但事实并非如此。请在下面查看我如何重现该问题。
正如您在任务列表中看到的那样。有 2 个 app 实例。最前面是使用深层链接调用的,最后是通过单击应用程序图标来调用的。
我尝试将以下技术结合使用,以确保任务列表中只有 1 个应用程序实例。
<activity
android:name=".JStockFragmentActivity"
android:launchMode="singleTop"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<!-- Sets the intent action to view the activity -->
<action android:name="android.intent.action.VIEW" />
<!-- Allows the link to be opened from a web browser -->
<category android:name="android.intent.category.BROWSABLE" />
<!-- Allows the …Run Code Online (Sandbox Code Playgroud)