很多时候,我们希望一个服务运行到某个条件满足的时候,打开一个窗口。在Android中表现为用Service启动Actvity。

如果在Service启动Actvity,关键是加上一行代码

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

这里需要解释,Flag的意义。

(以下资料摘自网络)

首先简单说下Task和Activity的关系。
Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activity)则会在最上面。从Task中取出东西(Activity)是从最顶端取出,也就是说最先取出的是最后添加的东西(Activity),以此类推,最后取出的是第一次添加的Activity,而Activity在Task中的顺序是可以控制的,在Activity跳转时用到Intent Flag可以设置新建activity的创建方式;
Intent.FLAG_ACTIVITY_NEW_TASK
默认的跳转类型,会重新创建一个新的Activity,不过与这种情况,比方说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在Manifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.
FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于加载模式中的singletop,比如说原来栈中情况是A,B,C,D在D中启动D,栈中的情况还是A,B,C,D
FLAG_ACTIVITY_CLEAR_TOP
这个FLAG就相当于加载模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。类如:原来栈中的情况是A,B,C,D这个时候从D中跳转到B,这个时候栈中的情况就是A,B了
FLAG_ACTIVITY_BROUGHT_TO_FRONT
这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思! 比方说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以 FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个启动的,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B. 特别注意的是,我上面说的网上人描述的这个FLAG,会很容易让人误解成这样,A,B,C,D都是标准加载,然后我在D中启动A,这个intent加上FLAG_ACTIVITY_BROUGHT_TO_FRONT ,就会误认为变成B,C,D,A!!其实不是,这个时候应该是A,B,C,D,A.不信的人大家试试看。不过下面这个标记和这个标记就会让大家明白了!
FLAG_ACTIVITY_REORDER_TO_FRONT
就按在 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 最后说的,如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  这个也不知道具体怎么用,看文档有点象开辟新的Task,不过测试完,不像那么简单。因为测试结果很失望,用这个启动的Activity的TaskId是一样的!具体怎么用! 请大家知道的留言,谢谢!

  FLAG_ACTIVITY_NO_USER_ACTION
  onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。
比如,在用户按下Home键(用户的choice),它将被调用。比如有电话进来(不属于用户的choice),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的choice?
它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有     FLAG_ACTIVITY_NO_USER_ACTION来确定的。
注意:通过调用finish()使该activity销毁时不会调用该函数

  FLAG_ACTIVITY_NO_HISTORY
用这个标记顾名思义! 意思就是说用这个FLAG启动的Activity,一旦推出,他就不会存在于栈中,比方说!原来是A,B,C 这个时候再C中以这个FLAG启动D的 , D再启动E,这个时候栈中情况为A,B,C,E。

更多相关文章

  1. 美化你的listView
  2. (转载)Android下Affinities和Task
  3. Android(安卓)startActivityForResult()的用法
  4. Android中在一个应用中去启动另外一个应用
  5. Android(安卓)Studio 必备技巧:TODO 用法及自定义 TODO
  6. Android下affinities和任务(task)
  7. android google map添加标记和TipView
  8. android 设置控件的透明度
  9. lion下安装android

随机推荐

  1. java 8中构建无限的stream
  2. 在java中使用JMH(Java Microbenchmark Har
  3. java.util.concurrent简介
  4. java中Comparable和Comparator的区别
  5. 怎么break java8 stream的foreach
  6. java并发中的Synchronized关键词
  7. java中wait和sleep的区别
  8. 一文读懂java中的Reference和引用类型
  9. 在nodejs中创建child process
  10. java中的内部类内部接口详解