首页 > 代码库 > Intent传输数据的几种机制
Intent传输数据的几种机制
1.Intent是什么
Intent是视图的意思,它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同的组件时,通常就需要借助于Intent来实现。Intent可以启动应用中另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中的BroadcastReceiver。Activity,Service和BroadcastReceiver三个组件之间的通信都以Intent作为载体。
(1)启动一个Activity时,可以调用Context的startActivity(Intent intent)或者Activity的startActivityForResult(Intent intent,int requestCode),参数intent封装了需要启动的Activity的信息。
(2)启动一个Service时,可以调用Context的startService(Intent intent)的方法或bindService(Intent service,ServiceConnection conn,int flags)方法,Intent参数封装了需要启动的目标Service的信息。
(3)触发一个BroadcastReceiver时,可以调用Context的sendBroadcast(Intent intent),sendStickyBroadcast()或sendOrderedBroadcast(),这三个方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。
2.Intent存的是什么信息:(自己理解)Intent中存的信息包括本Activity的信息以及将要跳转的Activity的信息。
3.显式Intent和隐式Intent 显式Intent:决定目标组件的唯一要素是组件名称。更多的用在应用程序内部传递信息。
4.Intent解析机制:Android是通过Intent的action,type和category来判断的。 隐式Intent:没有明确指出组件名称,由Android系统帮助程序寻找与Intent请求意图最匹配的组件。Android系统使用IntentFilter来寻找与隐式Intent相关的对象。更多的用在不同应用程序传递信息:例如跳转到打开音乐播放器,打开图库等。
5.Intent启动Activity的方式。
startActivity()是异步操作,开启新的ActivityB和原的ActivityA同时执行。 startActivityForResult()是同步操作,ActivityA在开启新的ActivityB后将自己阻塞,ActivityB退出以后ActivityA才继续执行,并根据ActivityB返回的结果执行下一步的操作。
(1)使用startActivity(Intent intent)直接启动。
(2)使用startActivityForResult(Intent intent, Int requestCode),setResult(int resultCode, Intent intent),onActivityResult(int requestCode, int resultCode, Intent intent)
A通过startActivityForResult()开启B的流程。
a.首先在A中调用startActivityForResult(Intent intent, Int requestCode)。
Intent参数代表的是一个普通的intent,例如:从A跳到B,可以Intent intent = new Intent(A.cthis,B.class); intent指定了要跳转到B,且包含了A传给B的数据。requestCode>=0,如果A还要跳转到C,D等等,requestCode就对应不同的值。例如:从A跳转到B,C,D等等,可以分别用1,2,3等等来区分。在后面的onActivityResult()中需要以此来区分各个Activity传回的结果。
例如:
//startActivityForResult(intent,1); --1:B //startActivityForResult(intent,2); --2:C //startActivityForResult(intent,3); --3:C protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: ... break; case 2: ... break; case 3: ... break; default: break; }
b.在B中setResult(int resultCode, Intent intent)。
resultCode用来区分B有几种不同的返回结果。
intent(本例子)参数代表的是返回A,主要用来返回额外的数据,最终会传给A的onActivityResult()
c.最后在A中调用onActivityResult(int requestCode, int resultCode, Intent data)
requestCode :区分是哪个Activity传回来的
requestCode :区分传给哪个Activity
data : B中调用setResult时传回的那个intent。
6.Intent传递数据的方式。
(1)putXXXExtra(“key”,”value”);
(2)先new一个Bundle的对象,Bundle用来携带数据。然后在调用intent.putExtras(bundle);
(3)Intent要求传送的数据必须实现实现Serializable接口或者Parcelable接口中的一种。
7.Intent传递数据的类型。
(1)Integer类型的ArrayList
(2)String类型的ArrayList
(3)其他类型(其他类型好像只可以用串行化),要引用Serializable接口。Serializable接口就是java提供的通用数据保存和读取的接口。任何类型只要实现了Serializable接口就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以通过管道传输到系统的其他程序中。Serializable不仅可以本机使用还可以经由网路操作(RMI)。这样的好处是自动屏蔽了操作系统的差异。