最近在写程序,老是离不开Intent ,老是用,不是哪这里用,就是哪里用。用得太多了,反而给自己给总一些经验了。提供给大家参考。
Android
中各个组件主要是通过Intent来通讯。
Intent
负责对应用中一次操作的动作、动作、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。


因此,Intent在这里起着一个中间件的作用价值,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的传递。

Intent
原理:

是一个操作的抽象描述要执行的。它可用于发动了startActivity活动,broadcastIntent将其发送到任何有兴趣的BroadcastReceiver组件和startService(作用)或bindService(作用,ServiceConnectionint)以沟通,后台服务。

意向书规定,执行一个晚期运行在不同的应用之间的代码结合的设施。其最重要的用途是在活动,它可以被认为是胶之间的发射活动。它基本上是一个被动的数据结构持有一个动作的抽象描述要执行的。在一个信息的主要意图件

1.startActivity
2. broadcastIntent
3.startService()
4.bindService()
组件之间通讯和进程间通讯,减低耦合性。
Intent
各个属性1. action (动作) 是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作。
The general action to be performed
2. data
是执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示
The data to operate on
3. category
(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent被加进ALTERNATIVE intent列表里面,用户可以启动,
it should be included in a list of alternative actions the user can perform on a piece of data.
4. type
(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

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

6. extras
(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

Android
如何解析
Intent
在应用中,我们可以以两种形式来使用Intent

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

隐式Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

对于直接IntentAndroid不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此IntentActivityIntentReceiverService


Intent
解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intentactiontypecategory这三个属性来进行判断的,判断方法如下:



1.
如果Intent指明定了action,则目标组件的IntentFilteraction列表中就必须包含有这个action,否则不能匹配;


2.
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,如果Intent指明定了type,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。


3.
如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent scheme必须出现在目标组件的scheme列表中。


4.
如果Intent指定了一个或多个category,这些类别必须全部出现在组件的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity().

5.
如果category 指定了ALTERNATIVE and SELECTED_ALTERNATIVE.则可以通过queryIntentActivityOptions(ComponentName, Intent[], Intent, int),查询ActivityactionaddIntentOptions(int, int, int, ComponentName, Intent[], Intent, int, MenuItem[])增加action等信息。



Intent
离不开IntentFilter作用价值
.

总结:Intent所能实现的软件复用的程度是Activity+Service,参数传参,

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK中给出了Intent作用的表现形式为:
通过Context.startActivity() orActivity.startActivityForResult() 启动一个Activity
通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;

通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()) 发给broadcast receivers

Intent
属性的设置,包括以下几点:(以下为XML中定义,当然也可以通过Intent类的方法来获取和设置)
1Action,也就是要执行的动作
SDk
中定义了一些标准的动作,包括
onstantTarget componentAction
ACTION_CALLactivityInitiate a phone call.
ACTION_EDITactivityDisplay data for the user to edit.
ACTION_MAINactivityStart up as the initial activity of a task, with no data input and no returned output.
ACTION_SYNCactivitySynchronize data on a server with data on the mobile device.
ACTION_BATTERY_LOWbroadcast receiverA warning that the battery is low.
ACTION_HEADSET_PLUGbroadcast receiverA headset has been plugged into the device, or unplugged from it.
ACTION_SCREEN_ONbroadcast receiverThe screen has been turned on.
ACTION_TIMEZONE_CHANGEDbroadcast receiverThe setting for the time zone has changed.


当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们的自定义动作。
2Data,也就是执行动作要操作的数据
Android
中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs
3type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
4category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。还有其他的为
ConstantMeaning
CATEGORY_BROWSABLEThe 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_GADGETThe activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOMEThe 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_LAUNCHERThe activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCEThe target activity is a preference panel.


5component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如actiondata/typecategory进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
6extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者;另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。
对于显式IntentAndroid不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将 Intent映射给可以处理此IntentActivityIntentReceiverService
Intent
解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intentactiontypecategory这三个属性来进行判断的,判断方法如下:

如果Intent指明定了action,则目标组件的IntentFilteraction列表中就必须包含有这个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-Filter
的定义
一些属性设置的例子:
<action android:name="com.example.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />
完整的实例
<activity android:name="NotesList" android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
Intent
用法实例
1.
无参数Activity跳转
Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);

2.
向下一个Activity传递数据(使用BundleIntent.putExtras
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle); // it.putExtra(
test, "shuju);
startActivity(it); // startActivityForResult(it,REQUEST_CODE);

对于数据的获取可以采用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

3.
向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity
Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString("name", "This is from ShowMsg!");
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);
4.
回调上一个Activity的结果处理函数(onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE){
if(resultCode==RESULT_CANCELED)
setTitle("cancle");
else if (resultCode==RESULT_OK) {
String temp=null;
Bundle bundle=data.getExtras();
if(bundle!=null) temp=bundle.getString("name");
setTitle(temp);
}
}
}
下面是转载来的其他的一些Intent用法实例(转自javaeye
显示网页
1. Uri uri = Uri.parse("
http://google.com");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);

显示地图
1. Uri uri = Uri.parse("geo:38.899533,-77.036476");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
4. //
其他 geo URI 範例
5. //geo:latitude,longitude
6. //geo:latitude,longitude?z=zoom
7. //geo:0,0?q=my+street+address
8. //geo:0,0?q=business+near+city
9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom
路径规划

1. Uri uri = Uri.parse("
http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456
打电话
1. //
叫出拨号程序
2. Uri uri = Uri.parse("tel:0800000123");
3. Intent it = new Intent(Intent.ACTION_DIAL, uri);
4. startActivity(it);

1. //
直接打电话出去
2. Uri uri = Uri.parse("tel:0800000123");
3. Intent it = new Intent(Intent.ACTION_CALL, uri);
4. startActivity(it);
5. //
用這個,要在 AndroidManifest.xml 中,加上

6. //<uses-permission id="android.permission.CALL_PHONE" />
传送
SMS/MMS
1. //
调用短信程序

2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. it.putExtra("sms_body", "The SMS text");
4. it.setType("vnd.android-dir/mms-sms");
5. startActivity(it);
1. //
传送消息

2. Uri uri = Uri.parse("smsto://0800000123");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. it.putExtra("sms_body", "The SMS text");
5. startActivity(it);
1. //
传送
MMS
2. Uri uri = Uri.parse("content://media/external/images/media/23");
3. Intent it = new Intent(Intent.ACTION_SEND);
4. it.putExtra("sms_body", "some text");
5. it.putExtra(Intent.EXTRA_STREAM, uri);
6. it.setType("image/png");
7. startActivity(it);
传送
Email
1. Uri uri = Uri.parse("
mailto:[email protected]");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. startActivity(it);

1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL, "
[email protected]
");
3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"
[email protected]
"};
3. String[] ccs={"
[email protected]
"};
4. it.putExtra(Intent.EXTRA_EMAIL, tos);
5. it.putExtra(Intent.EXTRA_CC, ccs);
6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
8. it.setType("message/rfc822");
9. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. //传送附件
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
5. sendIntent.setType("audio/mp3");
6. startActivity(Intent.createChooser(it, "Choose Email Client"));
播放多媒体
Uri uri = Uri.parse("file:///sdcard/song.mp3");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
it.setType("audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
Market
相关
1. //
寻找某个应用
2. Uri uri = Uri.parse("market://search?q=pname:pkg_name");
3. Intent it = new Intent(Intent.ACTION_VIEW, uri);
4. startActivity(it);
5. //where pkg_name is the full package path for an application
1. //
显示某个应用的相关信息

2. Uri uri = Uri.parse("market://details?id=app_id");
3. Intent it = new Intent(Intent.ACTION_VIEW, uri);
4. startActivity(it);
5. //where app_id is the application ID, find the ID
6. //by clicking on your application on Market home
7. //page, and notice the ID from the address bar
Uninstall
应用程序

1. Uri uri = Uri.fromParts("package", strPackageName, null);
2. Intent it = new Intent(Intent.ACTION_DELETE, uri);
3. startActivity(it);

Intent 有什么好处

这样做的好处:对于第三方的Activity,它只需要描述自己在什么情况下会被执行,如果我们启动Activity的描述信息正好和第三方的Activity的描述信息相匹配,那么这个第三方的Activity就会被启动;

该机制提供了两个关键好处:

Activities能够重复利用从其他组件中以Intent的形式产生的请求。

Activities可以在任何时候被具有相同IntentFilter的新的Activity取代。

各个组件之间通信作用。

更多相关文章

  1. 【Android(安卓)API指南】App组件(5) - Activities(3) - 任务和
  2. Android(安卓)SDK Document 框架导读的翻译和注解[7]——Intents
  3. Android自定义组件之TextView
  4. Android激活设备管理器--一键锁屏
  5. 【Android(安卓)Training - Multimedia】捕获照片 [Lesson 3 -
  6. Android可循环显示图像的Android(安卓)Gallery组件用法实例
  7. Android(安卓)分享功能,过滤掉不需要的组件,解决出现“Android系统
  8. android中intent的详解、用法、参数
  9. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Ro

随机推荐

  1. Mysql使用insert插入多条记录 批量新增数
  2. MySQL启动时InnoDB引擎被禁用了的解决方
  3. 解决Mysql收缩事务日志和日志文件过大无
  4. mysql的存储过程、游标 、事务实例详解
  5. MySQL5.7中 performance和sys schema中的
  6. 寻找sql注入的网站的方法(必看)
  7. MySQL批量SQL插入性能优化详解
  8. 细说MySQL死锁与日志二三事
  9. 解决“无法启动mysql服务 错误1069”的方
  10. 解决Windows10下mysql5.5数据库命令行中