关于Android错误的打开方式,续集。
2014-04-18 17:42
267 查看
接上文,上一篇文章/article/9656818.html我们解决了从安装界面打开导致程序出问题的情况,但是我留了个疑点。让我们详细来了解一下这个疑点,顺手把它解决了。哦,不对,松松的把它给解决了。
经实验证明,安装完成打开程序的时候,系统的确是为新程序新建了Task,并且程序也是存在这个Task中的。(直接在demo里写个getTaskId就知道了)
程序是跑在自己的Task上面,并且home键后,再从Launcher打开程序的时候,系统也的确是没有没有重新新建Task(实验证明,TaskId是一样的)。既然如此,为什么系统会重新打开一个实例呢。
呃,问题到这里我卡住了,所以我只能去看源码了。
最后发现,安装完成界面的Intent是通过getLaunchIntentForPackage方法获取的。我们来看看这方法怎么写的。来啊,上源码:
经过实验,排除其他的选项,发现添加intent.setPackage这句话会导致跳转出现问题。
也就是说这是Android本身代码的问题(原因就不深究了,源码太烦了)。希望Android尽早修复这个BUG。实验demo就不放出了,有兴趣的童鞋可以自行验证。
经实验证明,安装完成打开程序的时候,系统的确是为新程序新建了Task,并且程序也是存在这个Task中的。(直接在demo里写个getTaskId就知道了)
程序是跑在自己的Task上面,并且home键后,再从Launcher打开程序的时候,系统也的确是没有没有重新新建Task(实验证明,TaskId是一样的)。既然如此,为什么系统会重新打开一个实例呢。
呃,问题到这里我卡住了,所以我只能去看源码了。
最后发现,安装完成界面的Intent是通过getLaunchIntentForPackage方法获取的。我们来看看这方法怎么写的。来啊,上源码:
public Intent getLaunchIntentForPackage(String packageName) { // First see if the package has an INFO activity; the existence of // such an activity is implied to be the desired front-door for the // overall package (such as if it has multiple launcher entries). Intent intentToResolve = new Intent(Intent.ACTION_MAIN); intentToResolve.addCategory(Intent.CATEGORY_INFO); intentToResolve.setPackage(packageName); List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0); // Otherwise, try to find a main launcher activity. if (ris == null || ris.size() <= 0) { // reuse the intent instance intentToResolve.removeCategory(Intent.CATEGORY_INFO); intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); intentToResolve.setPackage(packageName); ris = queryIntentActivities(intentToResolve, 0); } if (ris == null || ris.size() <= 0) { return null; } Intent intent = new Intent(intentToResolve); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClassName(ris.get(0).activityInfo.packageName, ris.get(0).activityInfo.name); return intent; }
经过实验,排除其他的选项,发现添加intent.setPackage这句话会导致跳转出现问题。
也就是说这是Android本身代码的问题(原因就不深究了,源码太烦了)。希望Android尽早修复这个BUG。实验demo就不放出了,有兴趣的童鞋可以自行验证。
相关文章推荐
- 关于Microsoft Access数据库错误 '80004005',“已经被别的用户以独占方式打开,或没有查看数据的权限。”
- Android 关于SP读取与存储正确打开方式?
- Eclipse4.2安装android开发插件的错误(关于包依赖的错误解决方式之一)
- android开发之关于提高第三方app的service优先级(以及例举网上常见的错误方法)
- Android软键盘显示模式及打开和关闭方式(推荐)
- 举例说明android编程中遇到的关于android.view.InflateException错误的原因及解决办法
- Android 关于RelativeLayout.onMeasure出现的NullPointerException错误
- 关于打开酷狗就无法进行android程序调试的问题
- Android端 通过第三方应用打开文档的方式
- 关于SQL server 2012无法打开物理文件“某某某”,操作系统错误5 :"(拒绝访问)"。(Microsoft SQL Server,错误 5120)
- 关于Android的Adapter错误记录
- android创建快捷方式来打开应用中特定的Activity
- (android中的动态布局)关于Android下各个布局方式里面LayoutParams的用法
- 关于Android 设置监听的的四种方式的理解
- 关于Android app首次安装完成后在安装界面打开应用再按home键返回桌面,重新进入app重复实例化launcher activity(转)
- 关于Unity程序在IOS和Android上显示内嵌网页的方式
- 关于Android app首次安装完成后在安装界面直接“打开”应用再按home键返回桌面,重新进入app重复实例化launcher activity的问题的解决
- Android浏览器打开本地app前端同学的两种配置方式Url scheme和Android intent
- 在Android中调用浏览器打开网页方式
- Android Intent通过setDataAndType(uri, "type")打开文件方式