您的位置:首页 > 移动开发 > Android开发

关于Android错误的打开方式,续集。

2014-04-18 17:42 267 查看
接上文,上一篇文章/article/9656818.html我们解决了从安装界面打开导致程序出问题的情况,但是我留了个疑点。让我们详细来了解一下这个疑点,顺手把它解决了。哦,不对,松松的把它给解决了。

经实验证明,安装完成打开程序的时候,系统的确是为新程序新建了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就不放出了,有兴趣的童鞋可以自行验证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐