Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给Android,Android 会根据Intent的内容,查询各组件注册时的声明的IntentFilter,找到网页浏览器Activity来浏览网页。

在应用中,我们可以以两种形式来使用Intent:
直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver 或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”。对于没有明确指出目标组件名称的Intent,则称之为“隐式Intent”。Android系统使用Intent Filter 来寻找与隐Intent相关的对象。

  显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。

public void onClick(View v) {

Intent intent=new Intent();

intent.putExtra("string","获得了Activity01的数据");

intent.setClass(this, Activity02.class);

this.startActivity(intent);

}

代码简洁明了,执行了onClick()函数,就会马上跳转到名为Activity02的Activity中 ,并将参数带入到Activity中。

在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。具体的选择方法是:Android将Intent的请求内容和一个叫做Intent Filter的过滤器比较,Intent Filter中包含系统中所有可能的待选组件。如果Intent Filter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。

public class Activity01 extends Activity implements OnClickListener{

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button=(Button) findViewById(R.id.button1);

button.setOnClickListener(this);

}

public void onClick(View v) {

// TODO Auto-generated method stub

//Intent intent=new Intent();

//intent.putExtra("string","获得了Activity01的数据");

//intent.setClass(this, Activity02.class);

//this.startActivity(intent);

Uri uri=Uri.parse("smsto:0800000123");

Intent intent=new Intent(Intent.ACTION_SENDTO,uri);

intent.putExtra("sms_body","the sms text");

startActivity(intent);

}

}

public class Activity02 extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.second);

TextView textView=(TextView) findViewById(R.id.text);

Intent intent=getIntent();

String string=intent.getStringExtra("string");

textView.setText(string);

}

}

•用Intent调用系统中经常被用到的组件

1 ,web浏览器

Uri uri = Uri. parse ( "http://kuikui.javaeye.com" );

returnIt = new Intent (Intent . ACTION_VIEW , uri );

2,地图

Uri mapUri = Uri. parse ( "geo:38.899533,-77.036476" );

returnIt = new Intent (Intent . ACTION_VIEW , mapUri);

3,调拨打电话界面

Uri telUri = Uri. parse ( "tel:100861" );

returnIt = new Intent (Intent . ACTION_DIAL , telUri);

4,直接拨打电话

Uri callUri = Uri. parse ( "tel:100861" );

returnIt = new Intent (Intent . ACTION_CALL , callUri);

5,卸载

Uri uninstallUri = Uri. fromParts ( "package" , " xxx " , null );

returnIt = new Intent (Intent . ACTION_DELETE , uninstallUri);

6,安装

Uri installUri = Uri. fromParts ( "package" , " xxx " , null );

returnIt = new Intent (Intent . ACTION_PACKAGE_ADDED , installUri);

7,播放

Uri playUri = Uri. parse ( "file:///sdcard/download/everything.mp3" );

returnIt = new Intent (Intent . ACTION_VIEW , playUri);

8,掉用发邮件

Uri emailUri = Uri. parse ( "mailto:shenrenkui@gmail.com" );

returnIt = new Intent (Intent . ACTION_SENDTO , emailUri);

9,发邮件

returnIt = new Intent (Intent . ACTION_SEND );

String[] tos = { "shenrenkui@gmail.com" };

String[] ccs = { "shenrenkui@gmail.com" };

returnIt .putExtra(Intent . EXTRA_EMAIL , tos);

returnIt .putExtra(Intent . EXTRA_CC , ccs);

returnIt .putExtra(Intent . EXTRA_TEXT , "body" );

returnIt .putExtra(Intent . EXTRA_SUBJECT , "subject" );

returnIt .setType( "message/rfc882" );

Intent . createChooser ( returnIt , "Choose Email Client" );

10,发短信

Uri smsUri = Uri. parse ( "tel:100861" );

returnIt = new Intent (Intent . ACTION_VIEW , smsUri);

returnIt.putExtra( "sms_body" , "shenrenkui" );

returnIt.setType( "vnd.android -dir/mms-sms" );

11,直接发邮件

Uri smsToUri = Uri. parse ( "smsto://100861" );

returnIt = new Intent (Intent . ACTION_SENDTO , smsToUri);

returnIt.putExtra( "sms_body" , "shenrenkui" );

12,发彩信

Ur i mmsUri = Uri. parse ( "content://media/external/images/media/23" );

returnIt = new Intent (Intent . ACTION_SEND );

returnIt.putExtra( "sms_body" , "shenrenkui" );

returnIt.putExtra(Intent . EXTRA_STREAM , mmsUri);

returnIt.setType( "image/png" );

更多相关文章

  1. Android学习笔记---第三天---基础UI组件---Button&ImageButton
  2. Android学习笔记---第二天---基础UI组件---TextView
  3. Android组件化导致的代码不生效
  4. Android四大组件之 服务Service
  5. 使用Android自带Gallery组件实现CoverFlow
  6. 为Android写的WebService调用组件
  7. android UI组件
  8. 为Android封装的HTTP请求组件

随机推荐

  1. apk、dex、odex梳理
  2. Android(安卓)Studio使用技巧
  3. android view滑动的几种方法
  4. Android(安卓)Fragment与Fragment、Activ
  5. Android(安卓)开机自动启动服务
  6. Android(安卓)ViewGroup中addView方法使
  7. android 端拍照并运用Tesseract OCR 识别
  8. Android(安卓)- UI(User Interface)的基
  9. Jenkins构建android
  10. 一次List对象去重失败,引发对Java8中disti