首页 > 代码库 > 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)。这样的好处是自动屏蔽了操作系统的差异。