Intent 是Android程序中各个组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件中传递数据。我们一般可以用Intent启动活动(Activity)、启动服务(service)、以及发送广播(broadcastreceiver)等。
Intent用法大致分为两种,一种是显式Intent,一种是隐式Intent。
一、显式Intent
Intent有多个构造函数的重载,我们一般用Intent(Context packageContext,Class>cls)这个构造方法,其中接收的第一个参数Context要求提供一个启动活动的上下文,第二个参数Class指定想要启动的目标活动。Intent也叫意图,就是想要做什么地意思。比如在主活动中加入加入一个Button,通过点击Button来开启其他活动,我们可以这样做:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 传递意图,启动一个活动
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});
那么如何启动服务呢?同样需要实例化一个服务(Service,稍后博客会有相关服务知识的介绍),然后可以在代码中这样写:
Intent intent = new Intent(MainActivity.this, DownLoadService.class);
startService(intent);
这样就可以了。
那么广播呢?下面就介绍隐式Intent,在里边简单介绍。
二、隐式Intent
隐式Intent相比显式Intent含蓄了好多,不明确指出想要启动那一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮助我们找出合适的活动去启动。那么我们怎么可以像上边那样启动OtherActivity呢?
1.打开项目下的AndroidManifest.xml,找到OhterActivity的
2.在标签中配置
具体如下:
3.在需要启动活动的地方这样写就行了:
Intent intent = new Intent("android.example.androidintent.ACTION_START");
startActivity(intent);
那么出现了一个问题,
其实是因为android.intent.category.DEFAULT 是一种默认的category,在调用MainActivity的时候会自动将这个category添加到Intent中。
我们可以这样写:
Intent intent = new Intent("android.example.androidintent.ACTION_START");
intent.addCategory("android.example.androidintent.OHTER_CATEGORY");
startActivity(intent);
可以看到我们通过调用Intent中的addCategory()方法来添加一个category,那么怎么才能正常启动活动呢?这时就必须在配置文件AndroidManifest.xml中把这条category添加上去,这样写程序就不报错了:
我们现在可以试着发一个广播了,很简单,广播以后会写篇文章,在这我们就默认程序中有一个广播,怎么去传递意图呢?
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
使用隐式的Intent我们不仅可以启动自己程序内的活动,还可以启动其他应用的活动,这使得Android多个应用程序之间的功能共享成为可能,比如说你的应用程序中需要打开一个网页,我们就可以调用系统的浏览器来打开这个网页。怎么写呢?
Intent intent = new Intent(Intent.ACTION_VIEW); // Android系统内置的一个动作
// 通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()
// 方法将这个Uri对象传递出去
intent.setData(Uri.parse("http://blog.csdn.net/shr957250701"));
startActivity(intent);
当然我们也可以调用系统拨号界面:
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
好了,基本都讲完了,那个现在在说一下Intent携带数据,通过调用intent.putExtra("传递的名",需要传递的参数)方法来传递参数;
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("name", data);
startActivity(intent);
那么如何接收呢?
Intent intent = getIntent();
String data = intent.getStringExtra("name");
这样就可以接收了。
那么我们怎么可以再当前活动结束的时候,将数据返回上一个活动呢,这时候就需要用到startActivityForResult(intent, requestCode),其中第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
我们可以再MAinActivity的Button点击事件中这样写
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivityForResult(intent, 1);
然后我们在OtherActivity的Button点击事件中这样写,把这个页面结束,把值回传给MainActivity。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("return_data", "这是第一个页面接收到的结果");
setResult(RESULT_OK, intent);
finish();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode==RESULT_OK) {
//这里我们就可以得到从OtherActivity回传的值了
String resultData = data.getStringExtra("return_data");
}
break;
default:
break;
}
}