zoukankan      html  css  js  c++  java
  • Android学习笔记三:用Intent串联activity

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513399.html

        一:Intent  

        Intent可以理解为 意图。

        我们可以通过创建intent实例来定义一个跳转意图,意图包括:要跳转到哪个页面、需要传递什么数据。

        然后通过startActivity(intent)来启动跳转。

        有两种方式定义Intent:显式Intent、隐式Intent。

        二:显式Intent

        1)我们可以在actvity的java文件中,通过代码显示定义Intent,参数为:从哪个页面,跳转到哪个页面。

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    startActivity(intent);

       2) 我们还可以通过putExtra(key,value)的方法,往intent传入数据,携带到跳转到目标页。

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    intent.putExtra(name, data);
    startActivity(intent);

        在跳转目标页到java文件中,通过getIntent()提取链接到该activyty的intent实例,然后通过intent实例.getXXExtra(name)提取数据,XX是数据类型。

        3)我们也可以在跳转发起页获取到跳转目标页回传到数据

        跳转发起页:

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    startActivityForResult(intent, 1);//第一个参数是intent,第二个是请求码
    
    //重写结果回传函数,监听结果码以及回传的intent
    //第一个参数:请求码:用于校验是否该页面发起的跳转请求的回传结果
    //第二个参数:结果码:回传的结果码类型
    //第三个参数:Intent实例:跳转目标页通过一个intent来携带数据,返回发起页。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {//根据请求码来匹配是哪个跳转请求的回传结果
            case 1:
                if(resultCode == RESULT_OK) {//根据结果码,执行不同结果码对应的操作
                    String name = "return_data";
                    String returnData = data.getStringExtra(name);//通过回传的intent提取数据
                    ......//使用数据:赋值给变量、调用其他函数、赋值给视图控件等
                }
                break;
            default:
        }
    }

        跳转目标页:

    Intent intent1 = new Intent();//创建回传的intent实例
    intent1.putExtra(name, data);//携带数据
    setResult(RESULT_OK, intent1);//作为结果进行回传

        三:隐式Intent

        上面我们是通过代码来创建Intent实例,这样做的优点是比较灵活,随创随用;缺点也很明显,对于一些通用性的跳转类型,需要不断创建相同的intent。

        为此,android提供了隐式Intent。

        隐式Intent可以理解为配置式的Intent:在Manifest文件中注册activity时,通过<activity>标签下配置<intent-filter>的内容,指定当前活动能够响应的action和category。由系统自己去分析这个某一个Intent实例,然后在manifest.xml配置好的众多activity中帮我们找出最合适的Activity去启动

        action表示普通的、被执行的行动,如ACTION_VIEW,ACTION_EDIT,ACTION_MAIN等。 

        【action值不是android内置的,而是由自己命名的独一无二的字符串,使用 android:name 特性来指定对响应的动作名时,通常使用基于 Java 包的命名方式:包路径.intent.大写的action名】

       如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况:
        (1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配;
        (2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺
    利地通过<intent-filter>的行为测试。

        category表示类别,为acttion行动提供额外的信息,用于在action匹配的基础上进行更加精准的定位。

      只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。   
    使用 android:category 属性用来指定在什么样的环境下动作才被响应。每个 Intent Filter 标签可以包含多个 category 标签。你可以指定自定义的种类或使用 Android 提供的标准值,如下所示:
    
    ❑ ALTERNATIVE
    ALTERNATIVE 种类指定,在某种数据类型的项目上可以替代默认执行的动作。例如,一个联系人的默认动作时浏览它,替代的可能是去编辑或删除它。
    
    ❑ SELECTED_ALTERNATIVE
    与 ALTERNATIVE 类似,但 ALTERNATIVE 总是使用下面所述的 Intent 解析来指向单一的动作。SELECTED_ALTERNATIVE在需要一个可能性列表时使用。
    
    ❑ BROWSABLE
    指定在浏览器中的动作。当 Intent 在浏览器中被引发,都会被指定成 BROWSABLE 种类。
    
    ❑ DEFAULT
    设置这个种类来让组件成为 Intent Filter 中定义的 data 的默认动作。这对使用显式 Intent 启动的 Activity 来说也是必要的。
    
    ❑ GADGET
    通过设置 GADGET 种类,你可以指定这个 Activity 可以嵌入到其他的 Activity 来允许。
    
    ❑ HOME
    HOME Activity 是设备启动(登陆屏幕)时显示的第一个 Activity 。通过指定 Intent Filter 为 HOME 种类而不指定动作的话,你正在将其设为本地 home 画面的替代。
    
    ❑ LAUNCHER
    使用这个种类来让一个 Activity 作为应用程序的启动项。

       data表示数据类型、格式,指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。

      在代码中创建Intent时,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
    ❑ android:host
    指定一个有效的主机名(例如, com.google )。
    
    ❑ android:mimetype
    允许你设定组件能处理的数据类型。
    
    ❑ android:path
    有效地 URI 路径值(例如, /transport/boats/ )。
    
    ❑ android:port
    特定主机上的有效端口。
    
    ❑ android:scheme
    需要一个特殊的图示(例如, content 或 http )。

        上面是关于在manifest中如何定义隐式Intent,那么在代码中怎么使用呢?

        我们在跳转发起页的java代码中,创建一个intent实例,然后为它指定action、catagory、data等,然后使用该intent来进行启动跳转。由android自身通过action、catagory、data等属性在manifest中寻找匹配的actvity来进行启动。

    Intent intent = new Intent("com.example.jared.activitystudy.ACTION_START");//使用action值作为参数创建intent
    intent.addCategory("com.example.jared.activitystudy.MY_CATEGORY");//为其添加catagory值
    intent.setData(Uri.parse(""));//为其设置数据,用于携带。【数据的类型需匹配隐式intent中定义好的格式】
    startActivity(intent);//启动

          

     

  • 相关阅读:
    [RxJS] Filtering operators: throttle and throttleTime
    [RxJS] Transformation operators: debounce and debounceTime
    [AngularJS] Default Child state and nav between child state
    [RxJS] Transformation operator: bufferToggle, bufferWhen
    [RxJS] Transformation operators: delay and delayWhen
    [RxJS] Transformation operator: buffer, bufferCount, bufferTime
    [RxJS] Transformation operator: scan
    [置顶] 利用Global.asax的Application_Error实现错误记录,错误日志
    Java方法重写与方法重载
    Inside GDALAllRegister之一: 五大部分
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7513399.html
Copyright © 2011-2022 走看看