最近在项目中遇到了一个版本适配问题,由于之前测试的时候一直在我自己的手机上测试的,我手机的 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 要合理得多。