Intent 解析

转载 2016年08月28日 22:25:44

一.Intent的介绍

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

二.Inten启动组件的方法

Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。具体方法如下:

组件名称

方法名称

 

Activity

startActvity( )

startActivity( )

 

Service

startService( )

bindService( )

 

Broadcasts

sendBroadcasts( )

sendOrderedBroadcasts( )

sendStickyBroadcasts( )

三.Intent的属性

Intent有以下几个属性:

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

1.Intent的Action属性

Action是指Intent要完成的动作,是一个字符串常量。SDK中定义了一些标准的Action常量如下表所示。

Constant

Target component

Action

ACTION_CALL

activity

Initiate a phone call.

ACTION_EDIT

activity

Display data for the user to edit.

ACTION_MAIN

activity

Start up as the initial activity of a task, with no data input and no returned output.

ACTION_SYNC

activity

Synchronize data on a server with data on the mobile device.

ACTION_BATTERY_LOW

broadcast receiver

A warning that the battery is low.

ACTION_HEADSET_PLUG

broadcast receiver

A headset has been plugged into the device, or unplugged from it.

ACTION_SCREEN_ON

broadcast receiver

The screen has been turned on.

ACTION_TIMEZONE_CHANGED

broadcast receiver

The setting for the time zone has changed.

 下面是一个测试Action常量的例子:

main.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7.     <TextView    
  8.         android:layout_width="fill_parent"   
  9.         android:layout_height="wrap_content"   
  10.         android:text="@string/hello" 
  11.         /> 
  12.     <Button   
  13.         android:text="测试Action属性" 
  14.         android:id="@+id/getBtn" 
  15.         android:layout_width="wrap_content"   
  16.         android:layout_height="wrap_content"   
  17.         /> 
  18. </LinearLayout> 

 strings.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <string name="hello">测试Action属性</string> 
  4.     <string name="app_name">IntentActionDemo</string> 
  5. </resources> 

MainActivity.java

  1. package com.android.action.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.  
  10. public class MainActivity extends Activity {  
  11.     private Button getBtn;  
  12.     @Override 
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.           
  17.         getBtn=(Button)findViewById(R.id.getBtn);  
  18.         getBtn.setOnClickListener(new OnClickListener() {  
  19.             @Override 
  20.             public void onClick(View v) {     
  21.                 Intent intent = new Intent();                 
  22.                 intent.setAction(Intent.ACTION_GET_CONTENT);// 设置Intent Action属性                  
  23.                 intent.setType("vnd.android.cursor.item/phone");// 设置Intent Type 属性   
  24.                                                                 //主要是获取通讯录的内容  
  25.                 startActivity(intent); // 启动Activity  
  26.             }  
  27.         });          
  28.     }  

效果图:

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是一系列的可选动作中的一个。下表是SDK文档中关于Category的信息。

Constant

Meaning

CATEGORY_BROWSABLE

The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.

CATEGORY_GADGET

The activity can be embedded inside of another activity that hosts gadgets.

CATEGORY_HOME

The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.

CATEGORY_LAUNCHER

The activity can be the initial activity of a task and is listed in the top-level application launcher.

CATEGORY_PREFERENCE

The target activity is a preference panel.

 下面是一个回到Home界面的例子:

main.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     >     
  6.     <TextView   
  7.     android:layout_width="fill_parent" 
  8.     android:layout_height="wrap_content"   
  9.     android:text="测试Intent Category"   
  10.     /> 
  11.     <Button   
  12.     android:id="@+id/Button1"   
  13.     android:layout_width="wrap_content" 
  14.     android:layout_height="wrap_content"   
  15.     android:text="转到Home界面" 
  16.     />    
  17. </LinearLayout> 

strings.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <string name="hello">Hello World, MainActivity!</string> 
  4.     <string name="app_name">IntentCategoryDemo</string> 
  5. </resources> 

MainActivity.java

  1. package com.android.category.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.  
  10. public class MainActivity extends Activity {  
  11.     private Button btn;  
  12.     @Override 
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.           
  17.         btn = (Button)findViewById(R.id.Button1);  
  18.         btn.setOnClickListener(new OnClickListener() {  
  19.             @Override 
  20.             public void onClick(View v) {     
  21.                 Intent intent = new Intent();                 
  22.                 intent.setAction(Intent.ACTION_MAIN);// 添加Action属性                
  23.                 intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性              
  24.                 startActivity(intent);// 启动Activity  
  25.             }  
  26.         });  
  27.     }  

 效果图:

 

4.Intent的Type属性

Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
 

5.Intent的Compent属性

Intent的Compent属性指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

 6.Intent的Extra属性

Intent的Extra属性是添加一些组件的附加信息。比如,如果我们要通过一个Activity来发送一个Email,就可以通过Extra属性来添加subject和body。

 下面的例子在第一个Activity的EditText输入用户名,该年龄保存在Intent的Extras属性中。当单击Button时,会在第二个Activity中显示用户名。

first.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     >     
  7.     <TextView     
  8.         android:layout_width="wrap_content" 
  9.         android:layout_height="wrap_content"   
  10.         android:text="请输入用户名"   
  11.         />        
  12.     <EditText   
  13.         android:id="@+id/EditText1"   
  14.         android:layout_width="fill_parent" 
  15.         android:layout_height="wrap_content" 
  16.         />        
  17.     <Button   
  18.         android:id="@+id/Button1"   
  19.         android:layout_width="wrap_content" 
  20.         android:layout_height="wrap_content"   
  21.         android:text="测试Extras属性" 
  22.         />        
  23. </LinearLayout> 

second.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     >         
  7.     <TextView   
  8.         android:id="@+id/TextView1"   
  9.         android:layout_width="wrap_content"   
  10.         android:layout_height="wrap_content" 
  11.         /> 
  12. </LinearLayout> 

strings.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <string name="hello">Hello World, FirstActivity!</string> 
  4.     <string name="app_name">IntentExtrasDemo</string> 
  5. </resources> 

FirstActivity.java

  1. package com.android.extras.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10.  
  11. public class FirstActivity extends Activity {  
  12.     private Button btn;  
  13.     private EditText etx;  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.first);  
  19.           
  20.         btn = (Button)findViewById(R.id.Button1);  
  21.         etx = (EditText)findViewById(R.id.EditText1);  
  22.           
  23.         btn.setOnClickListener(new OnClickListener() {  
  24.             @Override  
  25.             public void onClick(View v) {  
  26.                 Intent intent = new Intent();  
  27.                 //设置Intent的class属性,跳转到SecondActivity  
  28.                 intent.setClass(FirstActivity.this, SecondActivity.class);  
  29.                 //为intent添加额外的信息  
  30.                 intent.putExtra("useName", etx.getText().toString());  
  31.                 //启动Activity  
  32.                 startActivity(intent);  
  33.             }  
  34.         });         
  35.     }  

SecondActivity.java

  1. package com.android.extras.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.  
  8. public class SecondActivity extends Activity {  
  9.     private TextView tv;  
  10.       
  11.     @Override 
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         //设置当前的Activity的界面布局  
  15.         setContentView(R.layout.second);  
  16.         //获得Intent  
  17.         Intent intent = this.getIntent();         
  18.         tv = (TextView)findViewById(R.id.TextView1);  
  19.         //从Intent获得额外信息,设置为TextView的文本  
  20.         tv.setText(intent.getStringExtra("useName"));  
  21.     }  

注意:在添加第二个Activity SecondActivity的时候,要在AndroidManifest.xml里面添加上SecondActivity,具体如下,即是在15行</activity>的后面添加上16~18行的代码。如果不这样做,就会在模拟器上出现错误。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="com.android.extras.activity" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <uses-sdk android:minSdkVersion="10" /> 
  7.  
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".FirstActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.         <activity android:name=".SecondActivity" 
  17.                   android:label="@string/app_name"> 
  18.         </activity> 
  19.     </application> 
  20. </manifest> 

效果图:

本文出自 “IT的点点滴滴” 博客,请务必保留此出处http://liangruijun.blog.51cto.com/3061169/634411

最全面的Android Intent机制讲解

对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样。在 Intent 的使用中你看不到直接的函数调用,相对函...
  • phenixyf
  • phenixyf
  • 2016年07月22日 13:28
  • 373

Intent详解 (二) : 隐式Intent

所谓的隐式Intent与显式Intent的明显区别就是隐式Intent不用指定要启动的组件的信息。如果二者共存则以显式Intent调用为主。那隐式Intent有什么用呢?例如我们现在想查看一张照片,但...
  • Todo_
  • Todo_
  • 2016年02月25日 14:02
  • 710

Android编程之Intent源码详解

Intent源码详解,直接开始入题:   Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了   先来看一下 public class Intent impl...
  • xyz_fly
  • xyz_fly
  • 2014年02月07日 21:27
  • 6426

史上最全的隐式Intent解析

Android中的众多内置Intent,你知道它们各自的作用吗?本篇文章将带你全面解析Android中所有常见的内置Intent。...
  • c10WTiybQ1Ye3
  • c10WTiybQ1Ye3
  • 2016年05月20日 07:42
  • 58

Android Intent 序列化反序列化

上次遇到 Intent 使用用Parcel 序列化出错,未找到出错的原因,因项目急. 找其它的解决方法: 查看Intent 的源代码, 发现类中已经实现序列化功. 序列化 i...
  • hpccn
  • hpccn
  • 2013年12月24日 17:21
  • 4282

Android中Intent详解(二)之使用Intent广播事件及Broadcast Receiver简介

通过第一篇的讲解,我们已经看到了如何使用Intent来启动新的应用程序组件,但是实际上他们也可以使用sendBroadcast方法来在组件间匿名的广播消息。 作为一个系统级别的消息传递机制,Inten...
  • u010358168
  • u010358168
  • 2014年10月31日 11:48
  • 2577

Android6.0之Intent使用与源码分析

在一个Android应用中,主要是由四种组件组成的。而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由Intent协助完成的。...
  • LOVE000520
  • LOVE000520
  • 2017年04月18日 17:21
  • 578

Android自学笔记-14-意图(Intent)

Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。Android中的Intent可以理解为不同组件通信的媒介或者信使。...
  • mengxiangyue
  • mengxiangyue
  • 2014年04月23日 22:48
  • 2170

intent 解析

在一个Android应用中,主要是由四种组件组成的,这四种组件可参考“Android应用的构成”。 而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。 ...
  • darling757267
  • darling757267
  • 2012年04月18日 12:39
  • 250

Intent解析

Intent可以理解为不同组件通信的媒介或者信使。   Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast。   具体方法如下表: ...
  • luojianbinfen
  • luojianbinfen
  • 2014年04月25日 16:09
  • 275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Intent 解析
举报原因:
原因补充:

(最多只允许输入30个字)