在一个Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成。
正如网上一些人解析所说,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。
Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者,有两种方法来匹配:
1,显示匹配(Explicit):
public TestB extents Activity
{
.........
};
public class Test extends Activity
{
......
public void switchActivity()
{
Intent i = new Intent(Test.this, TestB.class);
this.startActivity(i);
}
}
代码简洁明了,执行了switchActivity()函数,就会马上跳转到名为TestB的Activity中。
2,隐式匹配(Implicit):
隐式匹配,首先要匹配Intent的几项值:Action, Category, Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。所以此部分只讲前几种匹配。匹配规则为最大匹配规则,
1,如果你填写了Action,如果有一个程序的Manifest.xml中的某一个Activity的IntentFilter段中定义了包含了相同的Action那么这个Intent就与这个目标Action匹配,如果这个Filter段中没有定义Type,Category,那么这个Activity就匹配了。但是如果手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。
Action的值在Android中有很多预定义,如果你想直接转到你自己定义的Intent接收者,你可以在接收者的IntentFilter中加入一个自定义的Action值(同时要设定Category值为"android.intent.category.DEFAULT"),在你的Intent中设定该值为Intent的Action,就直接能跳转到你自己的Intent接收者中。因为这个Action在系统中是唯一的。
2,data/type,你可以用Uri来做为data,比如Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);手机的Intent分发过程中,会根据http://www.google.com 的scheme判断出数据类型type
手机的Brower则能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能处理http:的type,
3,至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(String c);)的Intent都会与这个Category匹配。
4,extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
三,例子代码:
public class HelloActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);
menu.add(0, Menu.FIRST+1, 1, R.string.menu_open);
menu.add(0, Menu.FIRST+2, 2, R.string.menu_edit);
menu.add(0, Menu.FIRST+3, 3, R.string.menu_update);
menu.add(0, Menu.FIRST+4, 4, R.string.menu_close);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
super.onOptionsItemSelected(item);
switch(item.getItemId())
{
case Menu.FIRST + 1:
{
this.setTitle("Open Text!");
Intent i = new Intent();
i.setAction("test_action");
if (Tools.isIntentAvailable(this,i))
this.startActivity(i);
else
this.setTitle("the Intent is unavailable!!!");
break;
}
case Menu.FIRST + 2:
{
this.setTitle("Edit Text!");
break;
}
case Menu.FIRST + 3:
{
this.setTitle("Update Text!");
break;
}
case Menu.FIRST + 4:
{
this.setTitle("Close Text!");
break;
}
}
return true;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
}
}
public class TestIntent extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Testing Intent here!");
this.setContentView(tv);
}
}
来看看TestIntent所在项目的Manifest.xml
....
<activity android:name="TestIntent" android:label="@string/hello"><intent-filter>
<action android:name="test_action"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
.....
四。用Intent调用系统中经常被用到的组件
此常用组件部分来源于(http://kuikui.iteye.com/blog/318627 )
1 ,web浏览器
Uri uri = Uri. parse ( "http://kuikui.iteye.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`执行各种任务。需要注意的是,在实际应用中,可能还需要处理权限问题以及兼容性问题,确保所有功能能够在不同版本的Android系统上正常工作。此外,为了提高用户体验,建议开发者对...
android.intent.action.PACKAGE_REMOVED和android.intent.action.PACKAGE_ADDED 可以监听别的应用被安装卸载,但不能监听自己被卸载啊。 监听自己被卸载通过前辈们探索发现,只能通过监听系统卸载log如:act=...
### Android开发文档:Intent详解 #### 一、Intent概述 在Android开发中,`Intent`是一种核心机制,用于实现应用程序内部或跨应用...理解并熟练掌握`Intent`的使用,是成为一名合格的Android开发者的重要步骤之一。
Android中AsyncTak的使用与源码分析 Android AsyncTask 完全解析,带你从源码的角度彻底理解 Android 异步消息处理机制完全解析,带你从源码角度彻底理解 Android 异步消息处理机制 让你深入理解 Looper、...
本整理版主要涵盖了Android的核心概念,特别是关于应用程序组件的生命周期以及它们之间的交互。下面将详细阐述这些关键知识点。 首先,Android系统中的四大组件是Activity、Service、BroadcastReceiver和...
### Android技术面试整理知识点 #### 1. Android的四大组件及其作用 - **Activity**:作为用户界面的主要组成部分,Activity负责展示UI并处理用户输入。每个Activity代表一个屏幕,可以包含多个视图(View),用于...
2. **Android开发技巧总汇(2):Intent的使用** Intent是Android中用于启动服务、启动或跳转Activity的重要工具。了解如何构造和使用Intent,包括显式Intent和隐式Intent,以及如何传递数据,可以使得应用功能更加...
本文将基于“Android开发经验整理”这一主题,详细解析其中包含的关键知识点,旨在帮助新手开发者快速上手,避免常见错误,提升开发效率。 1. **环境配置**:Android开发首先需要安装Android Studio,这是Google...
Android 高级开发面试题以及答案整理 Android 高级开发面试题以及答案整理是 Android 开发者面试的重要参考资料。该资料涵盖了 Java 基础知识、Android 平台知识、数据存储、网络编程、多媒体处理、Android 架构...
本文将深入探讨如何实现Android应用中的Tab切换,主要基于标题和描述提供的关键词"android tab 切换 整理"。我们将讨论Tab布局的实现方式,包括使用TabHost、ViewPager和Android Design Support Library的TabLayout...
以上就是“android面试题整理”中可能涵盖的主要知识点,每个话题都值得深入探讨和实践,以确保在面试中能够全面展示自己的专业能力。通过持续学习和项目实践,开发者可以不断提高自己的技术水平,为面试做好充分...
【Android面试题整理】 在Android开发领域,面试是评估求职者技能的重要环节。这份文档“面试题整理”包含了大量关于Android开发的关键知识点和常见的面试题目,旨在帮助开发者系统性地复习和准备面试。以下是其中...
还可以使用 “am start -a android.intent.action.VIEW -d http://www.china.com” 打开中华网。 2. 查看输出语句 使用 Log 类可以输出错误信息,但是这些信息不会在控制台中显示。使用 “adb logcat” 命令可以...
在上述教程中,使用的最小SDK版本为7,这意味着应用至少支持Android 2.1(API level 7)及以上版本。然而,随着Android系统的不断更新和升级,开发者应该注意新版本Android带来的新特性和API变化,适时地更新和适配...