Android四大组件通信的Intent介绍和详解

Intent主要的作用是减少组件间的耦合,并且Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

1.1下面先介绍下显示意图的四种写法(注意第3种写法有两种)

1 //第1种显示的打开OtherActivity  OtherActivity.class为Activity类
2 Intent intent = new Intent(this, OtherActivity.class);
3 //第2种    OtherActivity.class为类
4 Intent intent  = new Intent();
5 intent.setClass(this, OtherActivity.class);
6 //第3种   com.xxx.activitys.OtherActivity 为Activity类加上包名  intent.setClassName("", ""); 第一参数为应用的包名 第二个为包名和类名 这个可以跨应用访问组件
7 intent.setClassName(this, "com.xxx.activitys.OtherActivity")
8 //第4种 OtherActivity.class 为Activity类名   
9 intent.setComponent(new ComponentName(this, OtherActivity.class));

1.2隐式意图的写法

  第一步在你想要到的目的地(所谓的要跳转的Activity,BroadcastReceiver,Service)添加<intent-filter > </intent-filter >

  例如:

  

<activity android:name=".OtherActivity" android:label="@string/title">
            <intent-filter >
                <action android:name="com.xx.zhangxx"/>
                <action android:name="com.xx.hello"/>
                <category android:name="com.xx.category.java"/> 
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.xx.category.php"/>
                <data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/>
                <data android:mimeType="image/*"/>
            </intent-filter>            
        </activity>

注意的事项:

  1.<category android:name="android.intent.category.DEFAULT"/> 这个category 必须写上 因为在系统的默认的情况下会自动添加上这个category 

  2.在只有action 和category的匹配的时候只需要对应出一个action和category 即可 匹配成功

  3.<data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/> 匹配的路径应该是 myscheme://www.xx.com/xx

  4.使用data中的 路径和mimeType都存在的时候需要使用的方法setDataAndType  不能单开写 否则会出错

  隐式意图在Java中的写法

1 Intent intent = new Intent();//隐式意图激活Activity
2 intent.setAction("com.xx.zhangxx"); //只需要匹配一个即成功
3 intent.addCategory("com.xx.category.java");   //只需要匹配一个即成功
4  intent.setDataAndType(Uri.parse("myscheme://www.xx.com/xx"), "image/jpeg");

Intent携带数据到另一组件的问题

1.1启动另一个组件的方法

startActivity(intent);//启动到另一组件 但是不会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据
startActivityForResult(intent, 100); //第二个参数为请求码 启动到另一组件 会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据

1.2

1.2.1使用Intent从一个组件到另一个组件传递数据

//在第一个组件中放入参数
Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("company", "我的Android工厂");
intent.putExtra("age", 5);
startActivity(intent);
//在第二个组件中接受参数的值
Intent intent = getIntent();//获取用于激活它的意图对象
String company = intent.getStringExtra("company");
int age = intent.getIntExtra("age", 0);

1.2.2使用Bundle传入多条数据

//在第一个组件中放入数据到Bundle 中
Intent intent = new Intent(this, OtherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("company", "我的Android公司");
bundle.putInt("age", 5);
intent.putExtras(bundle);
startActivity(intent);
//在第二个组件中接受数据 Intent intent = getIntent();//获取用于激活它的意图对象 Bundle bundle = intent.getExtras(); String company = bundle.getString("company"); int age = bundle.getInt("age");

1.3第二个组件关闭或者意外后返回数据的写法

   第一步:需要在第一个组件到第二个组件使用startActivityForResult(intent, 100);方法

 第二步:在第一个组件中重写方法onActivityResult

  

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//requestCode 为设置的等待的请求码  也就是上述的100
//resultCode 为在第二个组件中设置的结果码 
//data 为在第二个组件返回的数据
        String result = data.getStringExtra("result");
        Toast.makeText(getApplicationContext(),result, 1).show();
        
        super.onActivityResult(requestCode, resultCode, data);
}

 第三步:在第二个组件中intent中放入数据调用方法setResult(20, intent);//设置返回数据

  例如:

Intent intent = new Intent();
intent.putExtra("result", "我是第二个组件的返回的结果!");
setResult(20, intent);//设置返回数据
finish();//关闭Activity(关闭窗口)

 

希望对大家有帮助,有疑问欢迎提出问题,大家一起讨论和解决

  

 

posted @ 2015-07-30 14:31  Henry'Zone  阅读(519)  评论(0编辑  收藏  举报