Android Service启动到Activity的过程可以分为两类:显式意图和隐式意图。下面分别介绍这两种情况的实现方法。
1. 显式意图启动
显式意图启动是指从自己的应用的Service启动自己应用的Activity,即使用显式意图。示例代码如下:
```java
Intent intent = new Intent(EmqttService.this, CallingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
```
2. 隐式意图启动
隐式意图启动是指从自己的应用的Service启动到其他应用的Activity,或者从别的应用的Service启动到自己应用的Activity,即使用隐式意图。在要启动的Service里这样写:
```java
Intent i = new Intent("com.call");
i.addCategory(Intent.CATEGORY_DEFAULT);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
```
其中,"com.call" 是隐式意图的动作。
为什么Android在Service里面启动Activity要强制规定使用参数FLAG_ACTIVITY_NEW_TASK呢?这是因为在多任务环境下,如果不使用这个标志,可能会导致Activity被系统回收,从而无法正确显示。通过使用FLAG_ACTIVITY_NEW_TASK标志,可以确保每次启动Activity时都会创建一个新的任务栈,避免了这个问题。
我们可以做一个假设:假设我们需要在电话本应用中启动一个Service,让它执行5分钟后,再启动一个Activity。然而,在这个过程中,用户可能已经离开了电话本应用,转而打开了浏览器等其他应用程序。在这种情况下,如果我们在当前任务(例如浏览器的任务)中弹出Activity,用户可能会感到困惑,因为弹出的Activity与当前任务(浏览器任务)混在一起,而不是与电话本应用相关联。
为了解决这个问题,我们可以强制要求在启动Service时创建一个新的Task来承载这个Activity。这样,当Activity在新的Task中启动时,它就不会与用户的主任务(如浏览器任务)产生冲突。这种设计方式更加合理,能够确保弹出的Activity与应用之间有清晰的界限。
感谢大家阅读!本文首发于我的微信公众号,更多干货文章,请扫描二维码订阅哦。