您的位置:首页 > 移动开发 > Android开发

Android Intent详细介绍及使用说明(显式、隐式和值传递)

2015-02-07 09:55 621 查看
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的<activity>标签。

2.在标签中配置<intent-filter>的内容

具体如下:

<activity
android:name="com.example.androidintent.OtherActivity" >
<intent-filter >
<action android:name="android.example.androidintent.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

3.在需要启动活动的地方这样写就行了:

Intent intent = new Intent("android.example.androidintent.ACTION_START");

startActivity(intent);

那么出现了一个问题,<action>和<category>同时匹配才能像相应启动一个活动,那上边为什么可以呢?

其实是因为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添加上去,这样写程序就不报错了:

<activity
android:name="com.example.androidintent.OtherActivity" >
<intent-filter >
<action android:name="android.example.androidintent.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<span style="color:#ff0000;"><category android:name="android.example.androidintent.OHTER_CATEGORY"/></span>
</intent-filter>
</activity>

我们现在可以试着发一个广播了,很简单,广播以后会写篇文章,在这我们就默认程序中有一个广播,怎么去传递意图呢?

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点击事件中这样写

<span style="white-space:pre">		</span>Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivityForResult(intent, 1);
然后我们在OtherActivity的Button点击事件中这样写,把这个页面结束,把值回传给MainActivity。

<span style="white-space:pre">		</span>button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("return_data", "这是第一个页面接收到的结果");
setResult(RESULT_OK, intent);
finish();
}
});


这样我们就可以在MainActivity的onActivityResult(int requestCode, int resultCode, Intent data)这个方法中获取结果。

<span style="white-space:pre">	</span>@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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐