06 intent flag三种属性

原创 2016年08月29日 19:42:26

flag属性可以看做和写在清单文件中的启动模式一样 但效果有一定差别

1,FLAG_ACTIVITY_SINGLE_TOP:启动模式里的SingleTop一致  如果X启动模式设置为FLAG_ACTIVITY_SINGLE_TOP如果不在栈顶则创建一个X实例 如果在不创建。

2,FLAG_ACTIVITY__CLEAR_TOP:类似singleTask 不同之处:不管在不在此在栈顶都会删除自身然后重新创建一个新的Activity 所以叫CLEAR_TASK 具体: 首先将上方的Activity pop出 将自身的Activity销毁 重新创建一个Activity 在栈顶
                 >如果当前Activity存在   在栈顶  将将自身的Activity销毁 重新创建一个Activity 


3,FLAG_ACTIVITY_NEW_TASK

>1,不在清单文件中设置 和默认启动模式是一致的
            >2,在清单文件中设置属性  
                android:taskAffinity="aa.bb"
                android:allowTaskReparenting="true"


                taskAffinity用于指定当前Activity(activity1)所关联的Task,
                allowTaskReparenting用于配置是否允许该activity可以更换从属task


例子:第一个界面代码:

package com.qf.day06_intentflag;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
	
	private static final String TAG ="MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onCreate=="+this.hashCode());
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onNewIntent=="+this.hashCode());
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onDestroy=="+this.hashCode());
	}


	public void Onclick(View v){
		switch (v.getId()) {
		case R.id.btn01:
			Intent intent = new Intent(MainActivity.this, SecondActivity.class);
			//设置标记(启动模式)
			intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
			startActivity(intent);
			
			break;
		case R.id.btn02:
			Intent intent1 = new Intent(MainActivity.this, ThreeActivity.class);
			intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			startActivity(intent1);
			
			break;
		case R.id.btn03:
			
			Intent intent2 = new Intent(MainActivity.this, FourActivity.class);
			intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			startActivity(intent2);
			break;

		default:
			break;
		}
	}

}


第一个对应界面:


第四个个界面代码:

package com.qf.day06_intentflag;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class FourActivity extends Activity{
	

	private static final String TAG ="FourActivity";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout3);
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onCreate=="+this.hashCode());
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onNewIntent=="+this.hashCode());
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e(TAG, "===id==>"+this.getTaskId()+"==onDestroy=="+this.hashCode());
	}
	
	public void onMyClick(View v){
		
		switch (v.getId()) {
		case R.id.btnMain:
			Intent intent1 = new Intent(FourActivity.this, MainActivity.class);
			startActivity(intent1);
			break;
		case R.id.btnFour:
			Intent intent2 = new Intent(FourActivity.this, FourActivity.class);
			
			startActivity(intent2);
			
			break;

		default:
			break;
		}
		
	}

}


第四个对应界面:


清单文件::

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qf.day06_intentflag"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.qf.day06_intentflag.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".ThreeActivity"></activity>
        <activity 
            android:label="第四个"
            android:name=".FourActivity"
            android:taskAffinity="aa.bb"
            android:allowTaskReparenting="true"
            ></activity>
    </application>

</manifest></span>


我们进入第一个界面的时候


我们点击 FLAG_ACTIVITY_NEW_TASK



发现重新创建了一个栈: 这是我们再点机跳转到MainActivity


发现新生成的MainActivity在新的栈区中

我们打开后台窗口看看:


发现有两个进程,可以用此方法方便用户选择一个后台界面同时处理两件事。

我们继续在第四个Activity 的界面上


我们点击继续点击FLAG_ACTIVITY_NEW_TASK 看看


可见在一个FourActivity ---》》FLAG_ACTIVITY_NEW_TASK生成的心亲和栈区中 无法再生成一个FourActivity ---》》FLAG_ACTIVITY_NEW_TASK心的亲和栈区(这里只影响FourActivity 在生产亲和栈区 但不影响 其他 Activity生成亲和栈区 比如说在这里再生一个界面的的亲和栈区 )

注意FLAG_ACTIVITY_NEW_TASK 必须配合 android:taskAffinity
            android:allowTaskReparenting="true"使用。

****************************************************************************

在这里我们假设 MainActivity设置以下属性()


即与FourActivity ---》》FLAG_ACTIVITY_NEW_TASK生成的亲和区是一样的话



那么生成的亲和区还是在MainActivity的 栈中后台只有一个程序



>>>>>>>>>>>> 在这里我们假设一种情况<<<<<<<<<<<<<<<<<<<<<<<<<

A(一个Activiry)在清单中设置了亲和栈=“AA.AA”  B(一个Activiry)在清单中设置了亲和栈为=“BB.BB”

A此时跳转到B 但intent flag不设置任务启动模式 那么他们依然在一个栈

如果C(一个Activiry)设为亲和栈为=“AA.AA”   

因为B会依然跟随A所以 ABC三个在一个栈区中

如果我们设置C=“BB.BB”

那么AB依然在一起  只不过C在另一个栈区中后台可以看见两个

****************************************************************************

我们在82栈区按下返回键


我们点击 “跳转到FourActivity” 自己跳转 但没有设置intent的flag属性  发现可以无限生成 可见他不影响 。

************在82栈区界面再点击mainActivity******************


*********在后台选择界面返回81栈区界面*************


然后再81栈区点击FLAG_ACTIVITY_NEW_TASK


此居然返回到了82栈区当前界面(注意返回到的不是FourActivity界面 而是FourActivity生成亲和栈区栈顶的界面)



版权声明:范明毅的个人博客,欢迎转载,转载请注明出处 举报

相关文章推荐

Intent 的Flag属性(Activity在栈位置的主宰者)

Intent 的Flag属性可用来控制Activity在栈中的排列位置,本文列举了常见的Flag. FLAG_ACTMTY_BROUGHT_TO_FRONT: 如特通过该Flag启动的Activi...
  • pengkv
  • pengkv
  • 2014-11-04 20:57
  • 1189

Android activity栈、启动模式和intent flag属性详解

一、activity栈的概念        1.每个app应用程序启动的activity都会保存在一个单独的栈里面。        2.有可能某个activity发生栈转移。 二、acitivity...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Intent中所有属性试玩(intentfilter,data,category,flag)

老套路,这次出现的需求是接入的融云IM及时通讯的sdk,在介绍视频中,作者有讲到需要对intentfilter等有比较深的理解。确实,在实践的时候,我觉得以前这块知识理解的很浅,没把他玩的溜,这块知识...

Intent.FLAG 属性大全

Intent.FLAG 属性大全

Intent Flag笔记

An intent is an abstract description of an operation to be performed.  It  * can be used with {@lin...

Android开发——Intent中的各种FLAG

Android中发送Intent的时候有很多的标志位可以使用。是在做各种各样UI跳转时,熟悉这些标志的作用会给开发过程带来很大的遍历,这几天找时间把这些Flag都看了一遍,顺便翻译了一下,为便于理解,...

与 TASK 有关的 INTENT对象中设置的FLAG

FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。 FLAG_ACTIVIT...

android Intent.FLAG大全

用法     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent的setFlag和addFlag有什么区别? setFlag是把之...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)