Intent的定义
Intent是一种运行时绑定的消息机制。三大组件——Activity、Service和Broadcast Receiver都是被消息激活的,这种消息就是Intent。简单的讲,想要从主活动跳转到其他活动是用Intent来实现的。
Intent本身还可以以键值对的形式封装数据,这些数据可以随着组件的相互触发而被传递到目标组件,目标组件可以接收并处理这些数据。
Intent的六大属性
- 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栈中的位置如何改变等等。