Activity之Intent隐式启动PK显示启动

来源:互联网 发布:apache配置https 编辑:程序博客网 时间:2024/04/30 06:12

一、标题中所说启动其实是跳转到下一个Activity方式。

严格意义上的启动指的是startActivity(intent),或者带值返回startActivityForResult(intent)。
本文就Activity的两种跳转方式具体写法、特点及用法(使用场合)做一下比较:

二、先记下结论:即使用场合

1、任何一个Activity的启动,我们都可以有两种方式(显式和隐式)

2、显式启动:用于启动同一个应用中的Activity,效率高

3、隐式启动:用于启动不同应用中的Activity。

三、写法:

1、Intent

Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。

Intent七大属性:由以下各个组成部分:

component(组件):目的组件

action(动作):用来表现意图的行动

category(类别):用来表现动作的类别

data(数据):表示与动作要操纵的数据

type(数据类型):对于data范例的描写

extras(扩展信息):扩展信息

Flags(标志位):期望这个意图的运行模式

有关七大属性讲解详见《Intent七大属性》
官方建议使用隐式Intent。七大属性中,除了component属性为显式,其他均为隐式。

2、隐式启动:

相比于显式Intent,隐式Intnet则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

清单文件中要为Activity注册

<activity       android:name=".SecondActivity">    <intent-filter>         <action android:name="com.sina.intent01.MY_ACTION"/>          <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>

Activity 中 Intent Filter 的匹配过程 :
这里写图片描述

button1.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                Intent intent = new Intent();                intent.setAction(Intent.ACTION_VIEW);                Uri data=Uri.parse("http://www.baidu.com");                intent.setData(data);                                startActivity(intent);                    }        });

这里写图片描述
如果有多个组件被匹配成功,就会以对话框列表的方式让用户进行选择。

每个Intent中只能指定一个action,但却能指定多个category;类别越多,动作越具体,意图越明确
在Intent添加类别可以添加多个类别,那就要求被匹配的组件必须同时满足这多个类别,才能匹配成功。操作Activity的时候,如果没有类别,须加上默认类别
当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让用户自己选择
优先级从-1000至1000,并且其中一个必须为负的才有效
注:系统默认的浏览器并没有做出优先级声明,其优先级默认为正数。

3、显式启动;

Intent intent = new Intent(); //setClass方法的第一个参数是一个Context对象 //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象//setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象,不同包时,写类名的时候必须带上包名,否则找不到。 intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent);    //或者更简单的写法,通过带参构造函数直接传值Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent);

三、特点

显式启动:直接指定要跳转的Activity类名,不用过滤,效率高,适用于同一个应用中的不同Activity跳转

隐式启动:需要过滤,相对耗时,但可以找到所有之匹配的应用。适用于不同应用之间的Activity跳转。

2 1
原创粉丝点击