在同一个应用程序之间往往会通过Intent对象来指定一个activity. 并通过调用startActivity()方法和startActivityForResult()方法来启动这个
activity。另外,通过intent也可以调用其他应用程序的activity. SDK s甚至还允许开发人员自定义Activity Action.
这里我们看到,通信的关键是Intent对象。
根据intent对象多种重载的构造方法,我们可以把起分为显示intent对象和隐式intent对象。
以下为常用的intent构造函数:
显示intent对象构造器
pulic Intent(Context packageContext,Class<?cls >
隐式intent对象构造器
pulic Intent (String action)
public Intent (String action , Uri uri).
隐式intent对象,也就是说,通过intent对象并未明确指定intent的目标是哪一个Activity, 这些目标要依靠定义在AndroidManifest.xml文件中的配置信息才能够确定,也就是说,可以action 所指的目标可能有多个。在AndroidManifest.xml文件中可以配置多个接收同一个actiond的Activity action.
首先,我们看一下通过显示的intent对象来启动其他的activity.
1 通过startActivity( )方法来启动一个activity,
Intent intent = new Inent (this, Test.class);
StartActivity(intent);
如果我们要向新启动的activity传递数据的话,可以通过intent类的PutExtra方法。该方法有多种的重载。下面是常用的几种重载方式;
Public Intent putExtra(String name, String value)
Public Intent putExtra (String name, boolean value)
Public Intent putExtra (String name, int value)
Public Intent putExtra (String name ,Serializable value)
从上面多个构造方法可以看出,putExtra()方法可以保存各种类型的值。当通过startActivity()方法启动新的Activity的时候,这些值也
会一同传递到新启动的Activity. 在新的activity中,我们可以通过getIntent.getExtra()方法获得一个Bunble对象,并通过相应的Get方法获取
刚才put进去的值。
如果我们要通过putExtra()方法来传递一个复杂的数据,那么该数据必须是可序列化的。
例如,若我们要传递一个Person 对象的实例,则该类必须要实现Serializable接口。
class Person implements Serializable {
String name = "aaa" ;
int age = 12;
}
注意:使用putExtra()方法传递一个实现了Serializable接口的类的实例对象时,这个类中所有的成员也必须是可序列化的,否则会抛出异常。
若我们想要从新启动的activity 中获得返回的数据,那么在启动activity 的时候,因该通过调用startActivityForResult()方法。例如下面的代码:
Intent intent = new Intent (this, forResult.class);
startActivityForResult(intent , 1);
该方法 有两个参数:参数一是intent, 参数2 我们自定义的requestCode.该参数会在当前的Activity需要重写的onActivityResult()方法来获取返回
的 值。
例如,我们在启动的activity 中设置返回的数据通过如下代码:
情况1 :
getIntent.putExtra("test", "aaa");
setResult(20,getIntent()); // 保存结果代码和在启动的activity中设置的值。
情况2 :
setResult(21);
通过调用startActivityForResult()方法启动新的activtiy,一般我们都要在该类中 设置多个返回码。这个是由于startActivityForResult()的返回机制决定的。
@Override
protected void OnActivityResult( int requestCode, int resultCode, intent data) {
switch(requestCode) { // 首先应判断请求码 也就是我们在调用startActivityForResult 时的第二个参数
case 1:
if (resultCode == 20 ) {
textView.setText(date.getStringExtra("test")); // 这个是启动的activity返回的Intent
}
else if ( resultCode == 21) {
}
break;
default:
break;
}
super OnActivityResult( int requestCode, int resultCode, intent data);
}
调用其他应用程序中的activity(拨打点电话,浏览网页,发email)
关于应用程序的共享, 可以用contentProvider 共享应用程序的数据。这只是应用共享的一部分。下面是共享的令一种形式,activity Action.
这里我们要用到隐式的intent.
下面我们通过隐的式Intent 来调用系统应用程序的acitivity.
1 直接拨号
直接拨号的功能相当于我们直接拨打传入的手机号码。拨号对应的功能Action是Intent.ACTION_CALL.使用这个Action 必须要指定一个
uri. 代码如下:Intent callIntent = new Intent (Intent.ACTION_CALL, Uri.parse("tel"+12334444));
startActivity(callIntent);
在执行上述代码后,系统将会拨打在文本框中输入的电话号。
2 调用通讯录的Action 是 Intent.ACTION_CALL_BUTTON, 该action 没有输入和输出,可以使用如下代码直接调用。
intent callButtonIntent = new Intent(Intent.ACTION_CALL_BUTTON);
startActivity(callButtonIntent);
3 将电话号码传入拨号盘
如果只想将电话号传入拨号盘 ,然后在作进一步的处理,需要使用Intent.ACTION_DIAL, 该ACTION 也需要一个
Uri. 代码如下: Intent dialIntent = new Intent ( Intent.ACTION_DIAL , Uri.parse("tel"+11223333));
4 调用浏览器
android SDK内置的WEB浏览器也对外提供了ACTION 。可以通过这个ACTION来传递一个WEB 网址。
intent webIntent = new Intent ( intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(webIntent);
5 向EMAIL 客户端发送Email地址
Uri uri = Uri.parse("mailto:xxx@adc.com");
Intent intent = new Intent (Intent.ACTION_SENDTO,uri);
startActivity(uri);
6 发送email:
在很多情况下,我们不仅要传送Email地址,还包括标题,内容等实质的信息。这些信息可以通过Intent.ACTION_SEND传递。
代码如下:
Intent aa = new Intent (Intent.ACTION_SEND);
aa.putExtra(Intent.EXTRA_EMAIL,new String[] {"test@126.com"});
aa.putExtra(Intent.EXTRA_CC,new String[] {"tAA@126.com"});
aa.putExtra(intent.EXTRA_SUBJECT,“指定Email 主题");
aa.putExtra(Intent.EXTRA_TEXT,"这个地方是内容");
aa.setType("text/plain");
startActivity(Intent.createChooser(aa,"选择发送消息的客户端"));
这里要注意的是Intent.createChooser()方法,该方法可以创建一个自定义的选择器。因为在android 系统中支持intent.ACTION_SEND动作的
不止Email客户端。 还有发送短信的客户端等等。因此会弹出一个选择菜单。
7 可以通过intent.ACTION_GET_CONTENT动作来选择拥有相同类型的应用。如下
Intent audioIntent = new Intent(intent.ACTION_GET_CONTENT);
audioIntent.setType("audio/*");
startActivity(Intent.createChooser(audioIntent,"选择音频程序"));
以上,setType("audio/*“)设置了应用的类型是audio/*,该类型表示选择系统中所有支持音频功能的应用。同样,也会弹出选择菜单。