Android开发学习之Intent详解

本文转载自:http://blog.csdn.net/he90227/article/details/24360657 

Intent简介和详解:

         
Intent:协助应用间的交互与通信,Intent负责对应用中一次操作的动作,动作涉及的数据,附加数据进行描述。      
        ndroid则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
        Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。



Intent启动组件的方法:
    
    1.启动Activity:   激活一个新的Activity,或者让一个现有的Activity做新的操作
                   Context.startActivity(Intent intent)
                   Context.startActivityForResutle(Intent intent)
    2.启动Service:启动一个新的Service,或者向一个已有的Service传递新的指令
                   Context.startService(Intent intent)
                   Context.bindService(Intent intent)
    3.启动Broadcast:发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。 
                   Context.sendBroadcast()
                   Context.sendOrderedBoradcast()
                   Context.sendStickyBroadcast()
     
     注:Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver做出响应,
         不同类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。
         由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。



Intent的几个属性:

  动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。


1.Action属性:指Intent要完成的动作,是一个字符串常量,Android的SDK中定义了一些系统动作常量,
              如打电话,发短信,编辑,查询等动作常量


一些常用的Action:

ACTION_CALL activity 启动一个电话.
ACTION_EDIT activity 显示用户编辑的数据.
ACTION_MAIN activity 作为Task中第一个Activity启动
ACTION_SYNC activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.


  应用:
  1.通过Intent对象调用系统的拨号动作
  Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse(”tel://13800138000″));
 startActivity(i);
  2.通过Intent对象调用系统的获取联系人动作
  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_GET_CONTENT);
  intent.setType("com.android.cursor.item/phone");// 设置Intent Type 属性 ,主要是获取通讯录的内容  
  startActivity(intent);


2.Intent的Data属性
Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。比如:ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的URI匹配。


3.Intent的Category属性
Intent中的Category属性是一个执行动作Action的附加信息。
如:CATEGORY_HOME表示回Home界面,ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个

另解:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。intent类定义了许多category常数.

addCategory()方法为一个intent对象增加一个category,
removeCategory删除一个category,
getCategories()获取intent所有的category.


应用:回到Home界面的例子
btn = (Button)findViewById(R.id.Button1);  
btn.setOnClickListener(new OnClickListener() {  
    @Override 
    public void onClick(View v) {     
        Intent intent = new Intent();                 
        intent.setAction(Intent.ACTION_MAIN);// 添加Action属性                
        intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性              
        startActivity(intent);// 启动Activity  
    }  
});  


4.Intent的Extra属性:添加一些组件的简单附加信息
   1.在Extra中放置信息:
   //设置Intent的class属性,跳转到SecondActivity  
intent.setClass(FirstActivity.this, SecondActivity.class);  
//为intent添加额外的信息  
intent.putExtra("useName", etx.getText().toString());  
//启动Activity  
startActivity(intent); 
    2.获取Extra中的附加信息
    //获得Intent  
    Intent intent = this.getIntent();         
    tv = (TextView)findViewById(R.id.TextView1);  
    //从Intent获得额外信息,设置为TextView的文本  
    tv.setText(intent.getStringExtra("useName"));  


5.用Intent调用系统中常用的组件:
        1 ,web浏览器
  Uri uri = Uri. parse ( "http://www.google.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" );


  Intent的动画
  void, overridePendingTransition (int enterAnim, int exitAnim).
  在startActivity(Intent) or finish()的时候调用。


Intent的构造函数:
公共构造函数:

1、Intent() 空构造函数


2、Intent(Intent o) 拷贝构造函数


3、Intent(String action) 指定action类型的构造函数


4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider


5、Intent(Context packageContext, Class<?> cls) 传入组件的构造函数,也就是上文提到的


6、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前两种结合体


Intent有六种构造函数,3、4、5是最常用的
Intent(String action, Uri uri)  的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。


应用:
   1: Intent intent = new Intent(Intent.ACTION_EDIT, null);
   2: startActivity(intent);


这里用了第四种构造函数,只是uri参数为null。执行此代码的时候,系统就会在程序主配置文件AndroidMainfest.xml中寻找
<action android:name="android.intent.action.EDIT" />对应的Activity,
如果对应为多个activity具有<action android:name="android.intent.action.EDIT" />此时就会弹出一个dailog选择Activity。


利用Intent在Activity之间传递数据
在Main中执行如下代码:


   1: Bundle bundle = new Bundle();


   2: bundle.putStringArray("NAMEARR", nameArr);


   3: Intent intent = new Intent(Main.this, CountList.class);


   4: intent.putExtras(bundle);


   5: startActivity(intent);


在CountList中,代码如下:


   1: Bundle bundle = this.getIntent().getExtras();


   2: String[] arrName = bundle.getStringArray("NAMEARR");



Intent的解析:


在应用中,我们可以以两种形式来使用Intent:

1.1 显式Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。


2.2 隐式Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析将 Intent映射给可以处理此Intent的Activity、Service或Broadcast Receiver。
Intent解析机制
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的
application package的信息)来查找能处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
1.1  如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
1.2  如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
1.3  如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定type,将根据Intent中数据的scheme(比如 http:或者mailto:)进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
1.4 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值