zoukankan      html  css  js  c++  java
  • 06 intent flag三种属性

    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生成亲和栈区栈顶的界面)



  • 相关阅读:
    【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)
    【Linux】【Services】【SaaS】Docker+kubernetes(10. 利用反向代理实现服务高可用)
    socketserver.py
    Python 字符中文坑
    H3C对接华为S5700s---配置链路聚合
    format使用
    python 登入接口
    python 多级菜单
    Windows 下安装MongoDB
    Gerrit 服务器安装插件
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152286.html
Copyright © 2011-2022 走看看