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来开启其他活动,我们可以这样做:
那么如何启动服务呢?同样需要实例化一个服务(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>的内容
具体如下:
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添加上去,这样写程序就不报错了:
我们现在可以试着发一个广播了,很简单,广播以后会写篇文章,在这我们就默认程序中有一个广播,怎么去传递意图呢?
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
使用隐式的Intent我们不仅可以启动自己程序内的活动,还可以启动其他应用的活动,这使得Android多个应用程序之间的功能共享成为可能,比如说你的应用程序中需要打开一个网页,我们就可以调用系统的浏览器来打开这个网页。怎么写呢?
当然我们也可以调用系统拨号界面:
好了,基本都讲完了,那个现在在说一下Intent携带数据,通过调用intent.putExtra("传递的名",需要传递的参数)方法来传递参数;
那么如何接收呢?
这样就可以接收了。
那么我们怎么可以再当前活动结束的时候,将数据返回上一个活动呢,这时候就需要用到startActivityForResult(intent, requestCode),其中第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
我们可以再MAinActivity的Button点击事件中这样写
这样我们就可以在MainActivity的onActivityResult(int requestCode, int resultCode, Intent data)这个方法中获取结果。
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; } }
相关文章推荐
- Android 通过Intent使用Bundle传递对象详细介绍
- 【Android】Android中Intent的显式使用和隐式使用
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
- 显式与隐式Intent及AndroidManifest.xml文件中intent-filter参数说明
- 一个简单的Android Intent使用实例,包括显式/隐式2种调用
- Android Intent传递数据底层分析详细介绍
- Android 使用Intent隐式传递启动Activity(访问网址,打电话等)
- android学习记录(五)显式Intent与隐式Intent的功能与使用方法解析。
- Android 开发中使用Intent传递数据的方法
- Android中文件类File的详细使用说明
- Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
- android 使用Intent传递数据之全局变量传递
- Android 使用Intent传递数据
- Android 使用Intent实现Activity跳转和数据传递
- phonegap 开发入门 PhoneGap官方网站上有详细的入门示例教程,这里,我针对使用PhoneGap进行Android移动应用的开发对其官网的Get Started进行一些介绍、补充。 Ste
- Android Fragments 详细使用详细介绍
- android 使用Intent传递数据之剪切板
- Android Fragments 详细使用详细介绍
- android开发基础:Intent与Bundle的使用,实现页面跳转及信息传递
- android之Looper详解及api详细介绍,使用案例