Intent中addFlags()和SetFlags()的区别和详解

两个方法的区别是setflag是直接给intent设置新的flag,addflag是在已有flag上添加新的flag


Public Intent addFlags (int flags)

增加额外的标志到Intent(或者已经存在的flags值)

参数 flags 需要设置的新的flags

Returns(返回值)

返回相同Intent对象,用来将多个调用链接成一个调用的声明

详情参考setFlags(int)

 

public Intent setFlags (int flags)

设置特定的flags去控制Intent如何执行。大部分的values 依赖于正在被执行的Intent组件的类型,特别是FLAG_ACTIVITY_* 这些flags全部用在Context.startActivity() 和

FLAG_RECEIVER_* 这些flags全部用在 Context.sendBroadcast().

具体内容详情看taskback stack

参数 flags 设置要求的flags

 

Returns(返回值)

返回相同Intent对象,用来将多个调用链接成一个调用的声明

详情参考

getFlags()和addFlags(int)


相关知识的理解

Task

字面意思就是任务,而在安卓中,我们可以这样理解,就是我们需要完成的一项功能,例如我们给别人发送一条微信,通过支付宝支付。

 

Back Stack

字面意思,是回退栈的意思,它属于数据结构中栈的一种。当从一个Activity 跳到另一个Activity的时候,如果不进行特殊的处理,就会有Activity被压入栈。当回退栈为空的时候,表示当前,已经到达了Lancher。因此,我们就可以知道BackStack就是一个存储Activity的容器,一般情况下,每需要执行一个Task,都至少有一个回退栈,这个容器中也至少有一个Activity实例。

 

LanchMode的作用和使用方法

 

LanchMode作用

1.一般使用在Activity中,主要是解决需求问题,因为有了需求,谷歌的工程师才创造了这个东西;

 

LanchMode的使用方法

1.在AndoridManifest.xml文件下的activity 节点下 使用attribute, LanchMode

Key

(1).需要注意的是,LanchMode使用需要在Activity启动前才有效果;

(2).使用例子如下


 



LanchMode有下面四种模式(这四个模式的理解是看网上一篇博文总结的,现在找不见链接了)

 

Key:(1)和(2)属于可以被实例化,它的实例可以属于任何Task,可以处于任何BackStack

3)和(4)属于不可以被实例化多次,常用于启动一个Task,并且这个Task只有这一个实例,并且往往处于BackStack开始的位置。

 

(1)Standrad---默认的启动模式

新建一个StandardActivity,将它的启动模式置为Standrad,因为是默认启动模式,我们可以不设置,在这个Activity中,我们每按一次这一个按键,会从这个Activity跳到这个Activity。回退栈的情况如下图


Intent中addFlags()和SetFlags()的区别和详解_第1张图片

(2)singleTop

Key:注意理解栈顶和栈底的概念

当我们创建一个LanchModeSingTopActivity实例时候,系统会自动在回退栈中检测当前栈顶元素是否是我们需要访问的Activity,如果是就直接复用这个实例。下面这个例子就是当再次启动ActivityB的时候,因为栈顶元素就是启动模式为singleTopActicityB,所以直接复用这一个实例

Intent中addFlags()和SetFlags()的区别和详解_第2张图片

(3)singleTask

 Key:该模式不仅不会创建新的实例,还会将从已经创建实例开始到栈顶的所有实例全部清除,并将已经创建的实例放到栈顶。这样做可以将需要显示的实例显示在窗口上

Intent中addFlags()和SetFlags()的区别和详解_第3张图片

(4)singleInstance

设置了”singleInstance”模式的Activty,在启动的时候,会脱离于当前TaskBack Stack,在一个新的Back Stack中创建实例。

Intent中addFlags()和SetFlags()的区别和详解_第4张图片


1.android中如何关闭当前页面的Activity

(1).finish(),要紧跟在Intent

(2).this.onDestory();

(3)Android.os.Process.killProcess(android.os.Process.myPid());

(4).system.exit(0);

 

2.在已经启动ABCD四个Activity的情况下。再启动C的时候,不希望是ABCDC,而是AB,而且B上的数据需要保留

@Override
public void onClick(View view) {
    Intent it = new Intent(D.this,B.class);
    it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//设置可以关掉它所跳到的界面之外已经开启的activity在这里是把C关闭
    it.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//设置不要刷新即将跳转的页面
    D.this.startActivity(it);



Flag(标志)属性 详解

 

FLAG_GRANT_READ_URI_PERMISSION

如果设置了,Intent的接受者将被准许执行read操作(Intent 携带的URI数据和任何Clipdata中特定的URIs数据)的权限。

FLAG_GRANT_WRITE_URI_PERMISSION

如果设置了,Intent的接受者将被准许执行write操作(Intent 携带的URI数据和任何Clipdata中特定的URIs数据)的权限。

FLAG_GRANT_PERSISTABLE_URI_PERMISSION

当结合使用 flag_grant_read_uri_permission / flag_grant_write_uri_permissionURI权限授予可以坚持在设备重新启动直到明确撤销 用revokeuripermissionURIint)。

FLAG_GRANT_PREFIX_URI_PERMISSION

当结合使用 flag_grant_read_uri_permission / flag_grant_write_uri_permissionURI权限授予适用于任何前缀匹配不同于原始的授予的URI

FLAG_DEBUG_LOG_RESOLUTION

使能够使用调试功能的flag。设置之后,日志信息将在intent处理过程被输出,为了告诉你最后的解决列表被发现已创建。

FLAG_FROM_BACKGROUND

可以由调用者设置,以指示此意图来自后台操作,而不是来自直接用户交互.

FLAG_ACTIVITY_BROUGHT_TO_FRONT 

这个flag不能正常地被应用程序代码设置,而是系统为你设置由于在 launchMode 设置为singleTask模式

FLAG_ACTIVITY_CLEAR_TASK

如果通过 Context.startactivity()去设置/启动一个Intent,这个flag将导致任何存在的task,将与活动开始前清除的活动相关联.

FLAG_ACTIVITY_CLEAR_TOP

如果已设置,并且正在启动的活动已经在当前任务(backstack)中运行,那么,而不是启动该活动的新实例,而且它上面的所有其他活动都将被关闭,而这个意图将作为一个新的意图传递到(现在的顶部)旧活动中.

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

这个常数是在API级别21废弃掉。在API 21用 flag_activity_new_document 替代

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

如果设置,新活动不保存在最近启动的活动列表中。

FLAG_ACTIVITY_FORWARD_RESULT

如果设置这个intent是被用来从一个现有的acitivity启动到新的acitivity,现有activity的回复目标将被转移到新的activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

这个flag不能正常地被应用程序代码设置,而是系统为你设置,如果这个活动正在展开的历史堆栈(长按 Home键)。

FLAG_ACTIVITY_MULTIPLE_TASK

此标志用来创建一个新的task和启动一个活动到此任务

FLAG_ACTIVITY_NEW_DOCUMENT

此标志用于将文档打开到一个新的任务中,该任务源于intent启动的活动。

FLAG_ACTIVITY_NEW_TASK

设置此标志使activity将成为此历史堆栈上新任务的开始

FLAG_ACTIVITY_NO_ANIMATION

如果通过 Context.startactivity()去设置/启动一个Intent这个标志将阻止系统执行一个活动去下一个活动的过渡动画。

FLAG_ACTIVITY_NO_HISTORY

设置此标志activity将不添加到回退栈(backStack

FLAG_ACTIVITY_NO_USER_ACTION

设置此标志,将阻止onuserleavehint()正常回调发生在当前最前的活动,在它被停下来作为新启动活动被带到前面。

FLAG_ACTIVITY_PREVIOUS_IS_TOP

如果设置并使用此意图从现有的一个activity a启动到新activity b,新avitivity b将不会被视为栈顶而是activity a,而是决定是否新意图传递到顶部而不是启动新的活动。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

设置此标志使这个活动要么开始在一个新的任务或带到现有的任务的顶部,那么它将被启动作为任务的前门。

FLAG_ACTIVITY_REORDER_TO_FRONT

如果在通过 Context.startactivity()去设置/启动一个Intent,如果需要启动的activity已经运行,此标志使被启动的活动被带到任务的历史堆栈的前面.

FLAG_ACTIVITY_SINGLE_TOP

如果设置,activity将不会被启动如果其正在backstack的栈顶

FLAG_ACTIVITY_TASK_ON_HOME

如果在通过 Context.startactivity()去设置/启动一个Intent,此flag将使新启动任务置于当前活动任务的顶部(如果只有一个task时)。

FLAG_RECEIVER_REGISTERED_ONLY

如果设置,当发送一个广播只有注册接收器将被调用,没有BroadcastReceiver组件将被启动。



你可能感兴趣的:(安卓,安卓开发实践)