`
u011467537
  • 浏览: 10735 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Intent.FLAG_ACTIVITY_NEW_TASK的说明

 
阅读更多

1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 

2. Task默认行为: 

    (1) 前提: Activity A和Activity B在同一个应用中. 

         操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 按下BACK返回键(堆栈状态: A). 

    (2) 前提: Activity A和Activity B在同一个应用中, 应用名称为"TaskOne应用".

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity B(TaskA堆栈状态: AB), 长按Home键, 返回Launcher, 启动其它应用(如:电子书),

                 开僻一个新Task堆栈, 命名: TaskB, 长按Home健, 返回Launcher, 单击"TaskOne应用"图标, 此时TaskA堆栈返回前台,

                 Activity B为栈顶应用, 供用户使用. 

    (3) 前提: Activity A在名称为"TaskOne应用"的应用中, Activity C在名称为"TaskTwo应用"的应用中.

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity C(TaskA堆栈状态: AC),长按Home键, 返回Launcher, 启动"TaskTwo应用"即Activity C,

                 开僻新的Task堆栈, 命名为TaskB, 按BACK键返回Launcher, 单击"TaskOne应用"图标, 此时TaskA堆栈返回前台,

                 Activity C为栈顶应用, 供用户使用. 

3. Intent FLAG介绍:

    (1) FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中,前面这句话有点拗口,请多读几遍),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity

         a. 前提: Activity A和Activity B在同一个应用中. 

             操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B的Intent的Flag设为

                     FLAG_ACTIVITY_NEW_TASK, Activity B被压入Activity A所在堆栈(堆栈状态: AB).

            原因: 默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).

         b. 前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.

             操作1: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                       在Activity A中启动Activity C, 启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                       Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C), 长按Home键, 选择TaskA,

                       Activity A回到前台, 再次启动Activity C(两种情况1.从桌面启动;2.从Activity A启动,两种情况一样), 这时TaskB回到前台, Activity C显示, 供用户使用, 即:

                       包含FLAG_ACTIVITY_NEW_TASK的Intent启动Activity的Task正在运行, 则不会为该Activity创建新的Task,

                       而是将原有的Task返回到前台显示.

             操作2: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                       在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                       Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C),  在Activity C中启动

                       Activity D(TaskB的状态: CD) 长按Home键, 选择TaskA, Activity A回到前台, 再次启动Activity C(从桌面或者ActivityA启动,也是一样的),

                       这时TaskB回到前台, Activity D显示,供用户使用.说明了在此种情况下设置FLAG_ACTIVITY_NEW_TASK后,会先查找是不是有Activity C存在的栈,根据亲和             性(taskAffinity),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的顺序不变

    (2) FLAG_ACTIVITY_CLEAR_TOP:

         前提: Activity A, Activity B, Activity C和Activity D在同一个应用中.

         操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 在Activity B中启动

                 Activity C(堆栈状态: ABC), 在Activity C中启动Activity D(堆栈状态: ABCD), 在Activity D中启动Activity B,

                 启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP, (堆栈状态: AB).

    (3) FLAG_ACTIVITY_BROUGHT_TO_FRONT:

         前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                 Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C), 在Activity C中启动

                 Activity D(TaskB的堆栈状态: CD), 长按Home键, 选择TaskA, Activity A回到前台, 在Activity A中再次启动Activity C,

                 在启动Activity C的Intent中设置Flag为FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前台,

                 Activity C显示, (TaskB的堆栈状态: C).

    (4) FLAG_ACTIVITY_MULTIPLE_TASK:

         与FLAG_ACTIVITY_NEW_TASK结合使用, 首先在Intent中设置FLAG_ACTIVITY_NEW_TASK, 打开Activity,

         则启动一个新Task, 接着在Intent中设置FLAG_ACTIVITY_MULTIPLE_TASK, 再次打开同一个Activity,则还会新启动一个Task.

    (5) FLAG_ACTIVITY_SINGLE_TOP:

         当前Task堆栈中存在ABCD四个Activity, A是栈顶Activity, D为栈底Activity, 存在打开A的Intent中设置了

         FLAG_ACTIVITY_SINGLE_TOP标志, 则会使用栈顶A, 而不会从新New A.

    (6) FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

   一般与FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET结合使用,如果设置该属性,这个activity将在一个新的task中启动或者或者被带到一个已经存在的task的顶部,这时这个activity将会作为这个task的首个页面加载。将会导致与这个应用具有相同亲和力的task处于一个合适的状态(移动activity到这个task或者从中移出),或者简单的重置这个task到它的初始状态

   FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:在当前的Task堆栈中设置一个还原点,当带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求启动这个堆栈时(典型的例子是用户从桌面再次启动这个应用),还原点之上包括这个应用将会被清除。应用场景:在email程序中预览图片时,会启动图片观览的actvity,当用户离开email处理其他事情,然后下次再次从home进入email时,我们呈现给用户的应该是上次email的会话,而不是图片观览,这样才不会给用户造成困惑。

         例: 存在Activity A, Activity B, Activity C, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

              在Activity A中启动Activity B(TaskA堆栈状态: AB), 接着Activity B启动Activity C(TaskA堆栈状态: ABC),

              启动Activity C的Intent中设置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标题, 这样TaskA中有一个还原点,

              当有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求TaskA堆栈时(比如请求Activity A)

              系统就会将还原点以上的Activity清除, TaskA堆栈中只剩下了AB.

4. launchMode介绍:

    (1) standard: 

         如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,

         如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"standard"的

         Activity可以被实例化多次, 可以在Task中的任何位置, 对于一个新的Intent请求就会实例化一次.

   (2) singleTop: 

         如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,

         如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"singleTop"的Activity可以被

         实例化多次,  可以在Task中的任何位置, 对于一个新的Intent请求如果在Task栈顶, 则会用栈顶的Activity响影Intent请求,

         而不会重新实例化对象接收请求, 如果没有在栈顶, 则会实例化一个新的对象接收Intent请求.

   (3) singleTask: 

        "launchMode"设置为"singleTask"的Activity总是在栈底, 只能被实例化一次, 它允许其它Activity压入"singleTask"的Activity

         所在的Task栈,如果有新的Intent请求有此标志的Activity, 则系统会清除有此标志的Task栈中的全部Activity,并把此Activity显示出来.

   (4) singleInstance: 

         launchMode"设置为"singleInstance"的Activity总是在栈底, 只能被实例化一次, 不允许其它的Activity压入"singleInstance"

         的Activity所在Task栈,  即整个Task栈中只能有这么一个Activity.

5. taskAffinity属性: 

   (1) taskAffinity属性应和FLAG_ACTIVITY_NEW_TASK标志及allowTaskReparenting属性结合使用, 如果只使用taskAffinity属性,

        请参考上面Task默认的行为.

   (2) 与FLAG_ACTIVITY_NEW_TASK标志结合:

       a. 前题: Activity A和Activity B在同一个应用中, Activity A与Activity B设置不同的taskAffinity属性.

           操作: Activity A启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B

                   的Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时系统会新开僻一个Task堆栈,TaskB(TaskB堆栈状态: B).

       b. 前题: Activity A在"TaskOne应用"中, Activity C在"TaskTwo应用"中, Activity A和ActivityC设置了相同的taskAffinity属性.

           操作: Activity A启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity C, 启动Activity C的

                   Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时Activity C会压入与Activity A堆栈相同的TaskA堆栈(TaskA堆栈状态: AC).

   (3) 与allowTaskReparenting属性:

         例: 在"TaskOne应用"中有一个天气预报Activity A, Activity A与"TaskOne应用"中的其它Activity有默认的关系

              (taskAffinity属性都没有设置), 并且allowTaskReparenting属性设置为true, 现在存在一个"TaskTwo应用

              "启动了"TaskOne应用"中的天气预报Activity A,  这时Activity A与"TaskTwo应用"中的Activity在同一个Task,

              命名这个Task堆栈为TaskA, 这时"TaskOne应用"启动, 并且又打开发天气预报Activity A, 这时Activity A会从TaskA堆栈中转移到

              "TaskOne应用"所在的堆栈, 即Activity A可以在多个堆栈中来回转移.       
6. alwaysRetainTaskState属性:

    如果Task堆栈中的Root Activity设置了此属性值为true, 不管出现任何情况, 一直会保留Task栈中Activity的状态.

7. clearTaskOnLaunch属性:    

    如果Task堆栈中的Root Activity设置了此属性值为true, 只要你一离开这个Task栈, 则系统会马上清理除了Root Activity的全部Activity.

8. finishOnTaskLaunch属性:

    如果某Activity设置了finishOnTaskLaunch属性, 只要你一离开这个Task栈, 则系统会马上清除这个Activity,

    不管这个Activity在堆栈的任何位置.

1
0
分享到:
评论

相关推荐

    AppInstall.rar

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //调用系统api安装app Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile); intent.setDataAndType...

    android-将内容分享到自己的app

    像qq,微信那样 调用代码Intent intent=new Intent(Intent.ACTION_SEND);... intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(Intent.createChooser(intent, "请选择")); 可以选择分享到自己的app

    打开附件.java

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/myFile/"+name )); intent.setDataAndType(uri, "application/msword"); ...

    Android 调用第三方导航(百度、高德、腾讯)以及坐标转换

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); //启动调用 } catch (URISyntaxException e) { Log.e("intent", e.getMessage()); } } else {//未安装 //market为...

    Android中调用系统所装的软件打开文件

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //设置intent的Action属性 intent.setAction(Intent.ACTION_VIEW); //获取文件file的MIME类型 String type = getMIMEType(file); //设置intent的data和Type...

    MainActivity

    AndPermission.with(this) ... intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); Toast.makeText(MainActivity.this, "没有权限无法扫描呦", Toast.LENGTH_LONG).show(); } }).start();

    Android应用开发中模拟按下HOME键的效果(实现代码)

    下面提供代码示例,请参考。 代码如下:public boolean onKeyDown(int keyCode, KeyEvent event) { if ... intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startA

    Android 开机自启

    public class BootBroadcastReceiver extends BroadcastReceiver { static final String ACTION... sayHelloIntent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(sayHelloIntent); } } }

    具有拖曳功能的Gallery

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startActivity(intent); } }; private void initData() { m_list = new ArrayList, Object>>(); Map,...

    Android GPS定位

    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startService(i);  tv1 = (TextView) this.findViewById(R.id.tv1); openGPSSettings();// String ip=GetHostIp();// tv1.setText(ip);// Log.i("hello", "ip is...

    aidl2修正版

    项目a的service类里面需要给intent加上intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    安卓桌面小火箭发射

    1,小火箭喷火 图片切换的动画 2,自定toast来显示小火箭 设置view 和params 3,冒烟 1,冒烟动画 2,打开Activity来显示冒烟 在服务中打开Activity... intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在任务栈

    UrlToOpenApp

    本代码是androidstudio编写,其中也有eclipse版本在对应的eclipse文件夹里 ##效果 ##功能 1、通过intent启动app并传值 2、通过url可以自动启动app。... intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putE

    应聘android工程师的面试题锦集

     这里Android123提示大家,Intent的一些标记有FLAG_ACTIVITY_BROUGHT_TO_FRONT、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_...

    HXSDKHelper.java 环信Demo 

    Intent broadcastIntent = new Intent(ROOM_CHANGE_BROADCAST); broadcastIntent.putExtra("value", value); appContext.sendBroadcast(broadcastIntent, null); } @Override public void ...

    Android 中按home键和跳转到主界面的实例代码

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服务里调用,必须加入new task标识 intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); //主界面 Intent intent = new Intent(Intent....

    Android launcher中模拟按home键的实现

    Android launcher中模拟按home键的实现 ... mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  getApplicationContext().startActivity(mHomeIntent)

    Android activity堆栈及管理实例详解

    1. Intent对象的Activity启动标记说明: FLAG_ACTIVITY_BROUGHT_TO_FRONT 应用程序代码中通常不设置这个标记,而是由系统给单任务启动模式的Activity的设置。 FLAG_ACTIVITY_CLEAR_TASK 如果给Intent对象添加了这...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    android群雄传

    8.4 Intent Flag启动模式 203 8.5 清空任务栈 203 8.6 Activity任务栈使用 204 第9章 Android系统信息与安全机制 205 9.1 Android系统信息获取 206 9.1.1 android.os.Build 206 9.1.2 System Property 207 ...

Global site tag (gtag.js) - Google Analytics