Intent

任务和回退栈

  • 任务:任务是指执行特定作业时与用户交互的一系列Activity,也遵循先进后出原则!
    堆栈中的Activity永远不会重新排列,开启Activity会进入任务中,点击返回按钮会弹出任务
  • 回退栈:任务会一次的进入回退栈中,也遵循先进后出!
  • Activity启动模式(4s)
    • 设置启动模式
      • 在清单文件中,给指定的Activity设置启动模式,android:launchMode
        • standard,每次启动Activity都会新创建一个实例,进入任务栈中,遵循后进先出原则!
        • singleTop,顶部单一模式,如果设置此模式的Activity在栈顶,再次调用此Activity,不会重新创建一个新的Activity!如果不是处于栈顶,那么它和标准模式一样,每次会重新创建!
        • singleTask,任务栈内单一模式!如果设置此模式的Activity在任务中存在!再次调用的时候,会复用此Activity,并且遵循堆栈中的Activity永远不会重新排列,所以,它会清空它的顶部的所有Activity!
        • singleInstance,设置此模式的Activity,会单独存在一个任务栈中,如果再次调用,会复用原来创建的任务栈!并且,任务栈也遵循后进先出原则!
      • 可以在Java代码中,Intent跳转的时候,动态设置启动模式!intent.setFlags()
  • 启动模式在开发中的作用:Activity复用,节省内存!提高程序性能!避免!用户多次点击返回按钮无法推出程序!
  • 思考:什么情况下Activity会进行复用?
    • singleTop,该模式下当前Activity处于栈顶,再次调用会进行复用
    • singleTask,当前Activity已经创建过,再次创建的时候会复用,通过清空该Activity上部所有Activity让该Activity处于栈顶达到复用效果!
    • singleInstance,当前Activity已经创建过,再次调用会进行复用
  • onNewIntent(Intent intent)
    • 可以通过重写此方法,进行Activity的刷新工作!因此
      此方法只有在Activity发生复用的时候才会调用!具体复用就是以上三种情况!
  • 清单文件中和Java代码中设置启动模式的区别
    • 清单文件中可以设置四种启动模式!而Java代码中只能设置三种启动模式
    • 清单文件中一旦设置启动模式,那么该Activity的启动模式就固定了!但是Java代码中可以给一Activity在不同跳转的情况下设置不同的启动模式,启动模式并不固定!
    • 如果在清单文件中设置了启动模式,又在Java代码中设置了启动模式,那么以Java代码中的设置为准!
  • 代码中设置:
    • Intent setFlags()
      • FLAG_ACTIVITY_SINGLE_TOP:就是启动的SingleTop
      • FLAG_ACTIVITY_SINGLE_TOP|FLAG_ACTIVITY_CLEAR_TOP:就是启动的SingleTask
      • 不添加:就是默认standard模式
    • 作用范围:仅限于本页面跳转!

Intent页面跳转

  • Intent分类
    • 显式意图
      • Intent的一个属性ComponentName(组件名)
      • 显式意图的底层全部是封装ComponentName进行跳转!
        • 1.Intent intent = new Intent(当前组件.this,目标组件.class);
        • 2.Intent intent = new Intent(); intent.setClass(当前组件.this,目标组件.class);
        • 3.Intent intent = new Intent();
          ComponentName name = new ComponentName(当前组件.this,目标组件.class);
      • ComponentName
        • 它是Intent七大属性之一!用来组件间的跳转!它会形成显式意图!
        • 它可以进行跨程序页面跳转!
          • 目标程序已经在手机运行过
          • 知道目标程序的包名和Activity的全路径
          • 用法
            • Intent intent = new Intent();
              ComponentName cName = new ComponentName(1,2);
              intent.setComponent(cName);
              startActivity(intent);
    • 隐式意图
      -利用动作显式你要做的事,给定一些目标的参数!根据参数去匹配具体的组件!
      • 明确1:
        • 如果清单文件中的Activity没有intent-filter!那么想要打开此Activity只能使用显式意图!
      • 明确2:
        • 如果清单文件中的Activity有intent-filtet标签,那么想要打开此Activity可以选择显式意图或者隐式意图
      • 明确3:
        • 隐式意图匹配的过程,就是Intent和清单文件中的intent-filter进行匹配的过程!你发出的Intent匹配的手机所有包含intent-filter的组件!
      • 明确4:
        • 隐式意图匹配成功!Intent中包含的Action和Category还有Data type和intent-filter中包含的action和category和data还有type完全相符合,即匹配成功!
  • URI

    • URI 统一资源标识符!
      • scheme:协议
      • host:主机名
      • port:端口号
      • path:路径
    • URL 统一资源定位符!
  • Intent的7大属性

    • ComponentName,组件间跳转,可以是本程序,也可以是其他程序(手机中运行过);显式意图
    • Extra,Intent携带的数据,intent.putExtra(key,value)
    • Flags,Java代码设置启动默认是,此方法设置启动模式有三种,默认、SingleTop、SingleTask
    • Action
    • Category
    • Data
    • Type
      最后这四种属性,都是隐式意图的一部分!在Intent和Intent-filter进行匹配的过程中,这四种属性都是需要考虑的因素!
  • 利用隐式意图打开系统相关的Activity
    • 打电话(需要权限)
      • intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:18514592456"));
      • 设置权限<uses-permission android:name="android.permission.CALL_PHONE"/>
    • 拨号页面
      • intent.setAction(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:18514592456"));
    • 发短信
      • intent.setAction(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("smsto:111"));
        intent.putExtra("sms_body","i have nothing to say");
    • 设置页面
      • Action:Settings(android.provider包下的)
        • 打开设置WiFiu页面
          • intent.setAction(Settings.ACTION_WIFI_SETTINGS);
        • 打开总设置页面
          • intent.setAction(Settings.ACTION_SETTINGS);
    • 照相机(需要权限)
      • intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
      • 设置权限<uses-permission android:name="android.permission.CAMERA"/>
    • 打开本地文件
      • intent.setAction(Intent.ACTION_VIEW);
      • intent.setDataAndType(Uri data , String type)
        • data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值