安卓Activity 的Flags介绍

这里面只介绍那些特殊意义的Flags 与启动模式相同那些就不一一介绍了

最近在工作中遇到一个问题,在首页中打开某个view后 点击home键回到桌面 再次点击app icon后 之前被打开的view就会销毁然后发现首页的activity会重新启动 重走onCreate生命周期。

后来发现有一个办法可以有效的解决这个问题。

 if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
            LogUtils.i(TAG,"functionIN  getIntent.getFlags="+getIntent().getFlags()+"   Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT="+Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
            finish();


            return;
        }

FLAG_ACTIVITY_CLEAR_TOP
具有这个FLAG启动的Activity会把之前启动的Activity之上的Activity全部弹出栈空间。这个模式一般需要和FLAG_CTIVITY_NEW_TASK配合使用,在这种情况,被启动Activity的实例如果已经存在,那么系统就会调用它的onNewIntent。如果被启动的Activity采用Standard模式启动,那么它连同它之上的Activitiy都要出栈,系统会创建新的Activity实例并放入栈顶。

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。如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的选择?

它是根据促使当前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。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性android:excludeFromRecents="true"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章