最近在项目中遇到了一个版本适配问题,由于之前测试的时候一直在我自己的手机上测试的,我手机的 Android 版本是 7.1.2,测试是完全没有问题的,结果有天借了同事的 Lenovo X3c50 过来一测,完了,出 Bug 了。
Lenovo X3c50 的 Android 版本是 6.0.1,API 23,出现 Bug 的具体体现为 App 不能从 Service
中启动 Activity
,为了确定是否为 Android M 以下版本的问题,我特意找来了另一台 Android L 的手机,发现出现同样的情况。
由于项目中有使用 WebView
,内有大量的网页,而网页使用的 JQuery 在 Android L 及以下版本都都出现了一些异常,所以我需要解决上面提到的 Bug,使其兼容至 Android M。
在 Android N 及以上版本中,从 Service
中启动 Activity
的方式可以与从 Activity
中启动 Activity
的方式类似:
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
startActivity(intent);
但是在 Android M 中这种方法并不凑效,于是寻求其他方法,发现只需增添一行代码即可:
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
为什么 Android 在 Service
里面启动 Activity
要强制规定使用参数 FLAG_ACTIVITY_NEW_TASK
呢?
因为在 Service
中我们一般会进行耗时操作,也就是说可能这个耗时操作还没执行完,用户就打开了其他的程序,比如『Browser』,而当前的 TASK
就不是原程序中的 TASK
,如果此时原程序的 Service
弹出了 Activity
,该 Activity
就与『Browser』处于同一个 TASK
,用户就会莫名其妙,因为这个 Activity
是属于原程序的,而不是『Browser』的。
所以对于 Service
而言,干脆强制定义启动的 Activity
要创建一个新的 TASK
要合理得多。