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);//启动

 

 

      

 

posted @ 2017-09-13 09:37  .长卿  阅读(...)  评论(...编辑  收藏