

记一个launcher的bug - JackPeng博客
source link: http://yuanfentiank789.github.io/2016/12/14/launcherbug/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

关于Android app首次安装完成后在安装界面直接“打开”应用再按home键返回桌面,重新进入app重复实例化launcher activity的问题的解决
-
在package installers 安装界面安装完一个应用后,直接打开app,然后进入了 Activity_1, 此时再通过此activity用startActivity(intent)的方法打开 Activity_2.
- 然后按home键返回桌面,在桌面点击app图标进入,你觉得应该进入的是 Activity_2 ,实际上却是launcher Activity_1 .
-
然而还没完,这时候你按 back 返回键,会发现返回到了之前打开的 Activity_2,再按返回,又出现 launcherActivity_1. 也就是说系统重复实例化了Activity_1.
- 退出app后再次点击桌面图标进入,反复试验,没有再出现这个问题。也就是说,这个问题(bug ?)只出现在操作步骤(1)后才会产生.
另外发现,首次安装后,点击完成,然后通过命令启动app也会有这个问题:
adb shell am start -n packagename/launcheractivityname
但是如果指定action和category就不会有这个问题了:
adb shell am start -n pkgname/actname -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
以上问题我在一些知名厂商的app 上发现也存在这个BUG ,比如美团的App,首次安装后,点击打开美团,点击主界面的扫一扫,然后按Home键,再点击icon启动,发现扫一扫界面不见了,美团的处理方式是给了用户一个toast提示:扫描二维码已取消。
多次跟踪发现,点击icon启动App后,系统竟然再次创建了launcher Activity的实例,会执行他的oncreate方法,上面的问题,我觉得是Android系统的bug。
在super.onCreate(…)方法之后插入代码:
if (!isTaskRoot()
&& getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
&& getIntent().getAction() != null
&& getIntent().getAction().equals(Intent.ACTION_MAIN)) {
finish();
return;
}
当然可以根据实际情况变通下。
https://code.google.com/p/android/issues/detail?id=14262
https://code.google.com/p/android/issues/detail?id=2373#c40
Recommend
-
7
Android程序员面试宝典 okhttp源码特别特别复杂,类涉及较多,导致本文非常长,我相信没有几个人能把本文看完,所以特意录制了跟文章同步的视频。
-
13
Handler后台空闲线程IdleHandler - JackPeng博客在Android中,我们可以处理Message,这个Message我们可以立即执行也可以delay 一定时间执行。Handler线程在执行完所有的Message消息,它会wait,进行阻塞,知道有心的Message到达。如果这样子,那么这个线程也太...
-
16
一、问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果。
-
9
玩acm的都清楚,cin/cout在大家眼里跟没有一样,凡输入输出都是用c的函数的。 可偏偏c中没有bool这个类型,好吧,其实输出bool是当整形输出的。 #include <cstdio.h> int main() { bool b = true; printf("%...
-
13
promise执行顺序总结 - JackPeng博客1、 const promise = new Promise((resolve, reject)=>{ console.log(1); resolve(); console.log(2); }) promise.then(()=>{ console.log(4); }) console.log(5); ...
-
11
一、理解ViewTreeObserver概念 ViewTreeObserver用来注册监听器,在视图树全局发生变化时收到通知。它不能被应用实例化,因为它是由视图提供,通过android.view.View#getViewTreeObserver()来获取。 ViewTree:视图树。在An...
-
10
Camera使用记录 - JackPeng博客首先,本文主要以 android.hardware.Camera 包来叙述内容,其实Google官方已经把其作为Deprecated的了,但由于新的包 android.hardware.camera2 需要最低API level 21,即需要Android 5.0以上...
-
11
跳出手机的Dialog--Presentation 本文原创,转载请经过本人准许。 写在前面: Presentation 是 what?也许你刚看到标题的时候,会默默把这个单词扔到翻译工具里面,...
-
17
用Valgrind检测内存泄漏 - JackPeng博客系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。所以,在实践中会用到很多工具来调试...
-
9
LayoutInflater源码分析与应用 作者 CSDN_LQR
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK