Intent详解

来源:互联网 发布:linux查看数据库命令 编辑:程序博客网 时间:2024/06/09 19:03

Intent的定义

Intent是一种运行时绑定的消息机制。三大组件——Activity、Service和Broadcast Receiver都是被消息激活的,这种消息就是Intent。简单的讲,想要从主活动跳转到其他活动是用Intent来实现的。
Intent本身还可以以键值对的形式封装数据,这些数据可以随着组件的相互触发而被传递到目标组件,目标组件可以接收并处理这些数据。


Intent的六大属性

这里写图片描述

  1. ComponentName(组件名):用来处理Intent的匹配问题,可以被设置,也可以不设置。
    ①、显示Intent:设置了组件名的Intent叫做显示Intent在匹配时直接使用组件名里的参数。
Intent intent = new Intent();intent.setComponent(new ComponentName(Activity.this,SecActivity.class));

也可以简写:

Intent intent = new Intent(this,SecActivity.class);

②、隐式Intent:不设置组件名的Intent叫做隐式Intent,这种Intent在匹配时将会从Action、Data(URI和Type)或Category中寻找匹配信息。相比与显式Intent,隐式Intnet则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的Action和Category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

 Intent intent = new Intent("com.change.myapp"); startActivity(intent);

还需要在AndroidManifest中注册,设置需要匹配的信息,此处为Action和Category的匹配信息:

</activity>        <activity android:name=".SecActivity" >            <intent-filter>                <action android:name="com.change.myapp"/>                <category android:name="android.intent.category.DEFAULT"/>            </intent-filter> </activity>

2.Action(动作):描述Intent将要完成什么样的动作,比如在AndroidManifest.xml中注册主活动中都会有“Android.Intents.action.MAIN”,它表示标记当前Activity为程序的入口,除此之外,Action更多的是跟Data属性搭配,实现打电话,浏览网页,发短信等等功能。下图为一些系统内置的Action。
这里写图片描述
3.Data(数据):Data属性包括两部分,URI(通用资源标识符)和Type(MIME类型),下面是Data与Action搭配使用的代码
eg:拨打电话:

Intent intent = new Intent(Intent.ACCTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);

但是拨打电话比较特殊,需要在AndroidManifest.xml中设置权限,如下:

<uses-permission android:name="android.permission.CALL_PHONE"/>

4.Category(分类):一个含有Intent的附加信息的字符串,这些信息可以决定哪种组件应该处理这个Intent。Category一般被设置在IntentFilter中。
对于显式Intent,如果不指定Category,则无论IntentFilter的内容是什么都是匹配的。
对于隐式Intent,Android会自动加上CATEGORY_DEFAULT,这样一来,如果IntentFilter中没有这个Category的话,匹配就会失败。

<category android:name="android.intent.category.DEFAULT"/>

5.Extra:Intent通过Extra属性添加一些附加信息,可通过它来传递大量的数据。存储简单。有三种传递数据的方式:
①、直接的键值对形式
发送方:

Intent intent = new Intent();intent.setComponent(new ComponentName(MainActivity.this, SecActivity.class));intent.putExtra("text","我是从第一个界面的信息,第二个界面显示这段话吧");startActivity(intent);

接收方:

Intent intent = getIntent(); // 拿到Intent对象,开始解析数据 String text  = intent.getStringExtra("text");

②、通过Bundle对象封装
发送方:

Intent intent = new Intent();intent.setComponent(new ComponentName(MainActivity.this, SecActivity.class));Bundle bundle = new Bundle();bundle.putCharSequence("name","张三");bundle.putCharSequence("sex","男");bundle.putCharSequence("age","19"); intent.putExtra("student",bundle);startActivity(intent);

接收方:

Intent intent = getIntent();Bundle bundle = intent.getExtras(); // 得到Bundle对象,开始解析数据 Bundle bundle = intent.getBundleExtra("student");String name = (String) bundle.getCharSequence("name");String sex = (String) bundle.getCharSequence("sex");String age = (String) bundle.getCharSequence("age");

③传递序列化对象:将要传递的数据封装,第一种可以继承Serializable接口,之后再发送方直接封装或者在Bundle中封装该类的对象。第二种可以继承Parcelable接口,需要实现两个方法describeContents()和writeToParcel()和一个静态变量creator。接收方利用getSerializable和getParcelableExtra接收数据。

6.Flag(标志):Flag属性多用在我们Task和Activity栈的处理中。
可以通过使用不同的Flags来告诉系统一个Activity属于哪个Task、一个Activity被启动或停止后在Activity栈中的位置如何改变等等。

0 0
原创粉丝点击