重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android Service 基础知识点
盐田网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联建站成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
我们都知道Activity中启动Activity,只需要startActivity,如果在Service中启动Activity呢?
在Service中启动Activity,很多人说在非Activity中启动Activity需要加FLAG_ACTIVITY_NEW_TASK flag,如果我不加会怎么样呢?
并没有出现异常和崩溃,跳转也是正常的,但是与之前所说的会崩溃报出异常不符合啊?!难道是与版本有关吗?于是我使用了Android 23去测试果然抛出了异常
ContextImpl在Android studio中属于隐藏源码,在IDE中可能看不到,那就需要在SDK中去找 我的是:D:\AndroidSdk\sources\android-23\android\app\ContextImpl.java
可以看到只是判断条件不同而已,android-23中发现没有Intent.FLAG_ACTIVITY_NEW_TASK会直接抛出异常,而android-26中我们在非 Activity 调用 startActivity() 的时候,我们这个 options 通常是 null 的,所以在 26 之间的时候,误把判断条件 options == null 写成了 options != null 导致进不去 if,从而不会抛出异常
附加:在android 24-android 27(即android N-android O)之间出现了bug,也就是说即使没有加Intent.FLAG_ACTIVITY_NEW_TASK也会正常跳转
可以很明显看到判断条件targetSdkVersion Build.VERSION_CODES.N || targetSdkVersion = Build.VERSION_CODES.P 即在24-27
看Activity中启动Activity的源码
Activity.startActivity() -startActivityForResult()-mInstrumentation.execStartActivity() ...最终还是Ams去启动Activity 也就是Activity中重写了startActivity()方法所以不会出现这个异常
其实直观很好理解,如果不是在Activity中启动的,那就可以看做不是用户主动的行为,也就说这个界面可能出现在任何APP之上,如果不用Intent.FLAG_ACTIVITY_NEW_TASK将其限制在自己的Task中,那用户可能会认为该Activity是当前可见APP的页面,这是不合理的。举个例子:我们在听音乐,这个时候如果邮件Service突然要打开一个Activity,如果不用Intent.FLAG_ACTIVITY_NEW_TASK做限制,那用户可能认为这个Activity是属于音乐APP的,因为用户点击返回的时候,可能会回到音乐,而不是邮件(如果邮件之前就有界面)
对比源码发现,在我们非 Activity 调用 startActivity() 的时候,我们这个 options 通常是 null 的,所以在 24~27 之间的时候,误把判断条件 options == null 写成了 options != null 导致进不去 if,从而不会抛出异常,如此我们使用 Context.startActivity() 的时候是一定要加上 FLAG_ACTIVITY_NEW_TASK 的,但是在 Android N 到 O-MR1,即 24~27 之间却出现了 bug,即使没有加也会正确跳转
结语:感谢各位大佬的分享,对此有疑问的可以去运行跑一下,看一下相关的源码,如有错误的需要改进的地方,请留言评论指出,谢谢!
参考文章:
应该是你禁止微信读取更多设备信息了或者是你刷的ROM没有硬件信息,Android-23就是SDK版本为23的Android,也就是6.0
那是微信登陆你手机时的系统识别,以防止微信账号不是在你本手机上登陆时提示的安全风险,比如防止账号被盗等!
1.23是android api的级别,api 级别是一个对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值,23对应的android平台是android6.0,现在市场上的手机已经到android8.0了