我们已经知道了Android的基本组件了,今天讲的Intent就是连接他们之间的桥梁,确切的说是对Activity,Service,BroadcastReceiver的激活并作为他们之间的连接器。
总的来说Intent的功能有以下三点:
(1)激活组件,前面提到的三个基本组件的激活,但是激活方式不同;
(2)使用Android系统内置的Intent来完成发送短信、拨打电话,浏览网页和查看地图等手持设备的基本功能;
(3)激活组件时在组件之间传递数据;
下面我们将详细的介绍Intent的相关知识和使用。
一.Intent对象的属性
整理为下列表格中:
属性字段 | 名称 | 数据类型 | 获取方法 | 设置方法 |
Component Name | 组件名 | ComponentName | getComponent() | setComponent() setClass() setClassName() |
Action | 动作 | String | getAction() | setAction() |
Data | 数据 | URI | getData() getType() |
setData() setType() setDataAndType() |
Category | 分类 | String | getCategories() | addCategory() removeCategpry() |
Extra | 额外信息 | 1.键值对形式 <String,Object> 2.Bundle类型 |
1.get***Extra(): 获取不同的数据类型 2.getExtras(): 获取封装好的Bundle数据包 |
1.putExtra(): 以键值对的形式存放各种类型的数据 2.putExtras(): 放入包装好的Bundle数据包 |
Flag | 标志 | Integer | getFlags() | setFlags() |
下面具体讲解每一个属性:
1.Component Name:
――组件名用来处理Intent的匹配问题,它可以被设置也可以不被设置:
(1)设置了组件名的Intent为显示的Intent,直接使用组件名里的参数而实现连接器的功能,在开发过程中常用于一个应用程序内部的组件激活;
(2)未设置组件名的Intent为隐式的Intent,则将会从Action、Data(URI和Type)或者Category中寻找匹配信息,在开发中常用于激活其他应用程序的组件;
――用显示的方式指定Intent的匹配信息的方法有如下四种:
(1)直接在Intent的定义中指定组件名(最常用):
Intent i=new Intent(MainActivity.this,Act2.class); startActivity(i);
(2)使用setComponent()方法:
Intent i=new Intent(); ComponentName cn=new ComponentName(MainActivity.this, Act2.class); i.setComponent(cn); startActivity(i);
(3)使用setClass()方法:
Intent i=new Intent(); i.setClass(MainActivity.this, Act2.class); startActivity(i);
(4)使用setClassName()方法:
Intent i=new Intent(); i.setClassName(getBaseContext(), Act2.class.getName()); startActivity(i);
――用隐式的方式指定Intent的匹配信息,就要用到IntentFilter(Intent过滤器)了,通过在IntentFilter中的Action、URI、Category属性配置,先放一放后面再说。
2.Action:
用于描述Intent将要完成什么动作,分为系统自带的和自己定义的两种:
(1)常用的Android内置的Action列入下表格中:
Activity组件的:
Action的值 | 完成的动作 |
ACTION_CALL | 直接拨打Data属性指定的电话号码 |
ACTION_EDIT | 给用户显示可编辑的数据 |
ACTION_MAIN | 开启一个Activity并作为整个应用程序的入口Activity |
ACTION_SYNC | 同步服务器上的数据和移动设备上的数据 |
ACTION_DIAL | 将Data中的电话号码放入拨打电话的界面中显示给用户,用户可以手动拨出 |
ACTION_VIEW | 使用与Data中的数据相对应的应用程序来显示Data中指定的数据 |
ACTION_SEND | 发送数据 |
ACTION_SENDTO | 使用与Data中的数据相对应的应用程序向Data中指定的地址发送数据 |
BroadcastReceiver组件的:
Action的值 | 完成的动作 |
ACTION_BATTRY_LOW | 一个电池电量低的警告 |
ACTION_TIMEZONE_CHANGED | 时区改变的广播 |
ACTION_SCREEN_ON | 屏幕被打开 |
(2)自定义Action以后讲到广播时在进行详细讲解
(3)Action使用的例子,一会先说完Data之后一起使用。
3.Data:
(1)Data属性包括两个部分:URI和Type
(2)Data的常用取值如下:
Data取值 | 说明 |
file:/// |
后接本地文件数据的路径 |
mailto:// | 后接电子邮件地址 |
geo:// | 地理位置信息,后接经纬度 |
smsto:// | 发短信的电话号码 |
tel:// | 打电话的电话号码 |
content:// | 后接内容的定位 |
http:// | 超文本,后接网络资源的URI |
(3)到目前为止我们该拿出示例代码了:
MainActivity.java
package com.example.l0824_intent_actionanddata; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button btn_call,btn_send,btn_http,btn_file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_call=(Button)findViewById(R.id.button_call); btn_send=(Button)findViewById(R.id.button_send); btn_http=(Button)findViewById(R.id.button_http); btn_file=(Button)findViewById(R.id.button_file); btn_call.setOnClickListener(this); btn_send.setOnClickListener(this); btn_http.setOnClickListener(this); btn_file.setOnClickListener(this); } @Override public void onClick(View v) { Intent i=null; switch (v.getId()) { case R.id.button_call: i=new Intent(Intent.ACTION_CALL,Uri.parse("tel://10086")); break; case R.id.button_send: i=new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto://10086")); break; case R.id.button_http: i=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com")); break; case R.id.button_file: i=new Intent(Intent.ACTION_VIEW); i.setDataAndType(Uri.parse("file:///mnt/sdcard/a.mp3"), "audio/mp3"); break; default: break; } startActivity(i); } }
AndroidManiFest.xml
//添加打电话的权限 <uses-permission android:name="android.permission.CALL_PHONE"/>
main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/button_call" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="打电话" /> <Button android:id="@+id/button_send" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="发短信" /> <Button android:id="@+id/button_http" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="浏览网页" /> <Button android:id="@+id/button_file" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="播放影音" /> </LinearLayout>
运行效果:
4.Category:
常用的Category列如下表:
CATEGORY_HOME | 显示Home界面的Activity |
CATEGORY_LAUNCHER | 用于一个应用程序的入口Activity |
CATEGOYR_DEFAULT | 隐式Intent用到 |
隐式Intent的例子:
前面讲过隐式Intent多用于不同的应用程序之间,那我们下面就创建两个应用程序来说明:
(1)MainActivity.java
package com.example.l0824_intent_default; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent i=new Intent("com.example.l0824_intent_default.intent.action.Act_Default"); startActivity(i); } }); } }
(2)Act_Default.java
package com.example.l0824_intent_default; import android.app.Activity; import android.os.Bundle; public class Act_Default extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act_default); } }
(3)ActivityMainfest.xml
<activity android:name="com.example.l0824_intent_default.Act_Default"> <action android:name="com.example.l0824_intent_default.intent.action.Act_Default" /> <category android:name="android.intent.category.DEFAULT" /> </activity>
5.Extra(额外信息)和Intent数据传递
有一下两种传递方式:
(1)直接以键值对的形式传递
发送方:
Intent i=new Intent(MainActivity.this,Act2.class); i.putExtra("name", "张菲"); i.putExtra("password", "123"); startActivity(i);
接收方:
String name=getIntent().getStringExtra("name"); String password=getIntent().getStringExtra("password");
(2)使用Bundle数据包装数据
发送方:
Intent i=new Intent(MainActivity.this,Act2.class); Bundle b=new Bundle(); b.putString("name", "张菲"); b.putInt("password", 123); i.putExtras(b); startActivity(i);
接收方:
Bundle b=getIntent().getExtras(); String name =b.getString("name"); int pass=b.getInt("password");
6.flag(标志)
用的很少,几乎不用。