热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中Intent的使用

Android中Intent的使用Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一

AndroidIntent的使用

IntentAndroid程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景

一、 Intent用于启动活动或者服务

Intent可以分为显式Intent和隐式Intent两种

显式Intent

Intent有多个构造函数的重载,其中一个是Intent (Context packageContext,Classcls) ,这个构造函数接收两个参数,第一个参数是Context要求提供一个启动活动的上下文,第二个参数Class则是想要启动的目标活动
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);

隐式Intent用法一(启动本程序中的活动)

相对于显式Intent,隐式Intent则包含了许多,它并不明确指出我们想要启动哪一个活动,而是制定了一些更为抽象的actioncategory等信息,然后交给系统去分析这个Intent,并帮我们找到合适的活动,并启动它。
首先我们要在AndroidManifest中添加如下代码

<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
com.example.activitytest//是当前Activity所在的文件夹的名称

当和中的内容同时能够匹配上Intent中指定的actioncategory时,活动才能相应该Intent

然后在onclick()方法中添加

 Intent intent=new Intent("com.examole.activitytest.ACTION_START");
startActivity(intent);

这里运用Intent的另一个构造函数,直接将action的字符串穿了进去,表明我们想要启动能够响应com.examole.activitytest.ACTION_START这个action的活动,而category="android.intent.category.DEFAULT"是一种默认的category,在调用startActivity(intent);时会将此category添加到Intent中。

隐式Intent的用法二(启动别的程序中的活动)

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动

Intent intent=new Intent(Intent.ACTION_VIEW);//
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

这里我们指定IntentactionIntent.ACTION_VIEW这是Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析为Uri对象,然后再通过intent.setData()方法将这个Uri对象传递进去。
* setData()方法接收一个Uri对象,主要用于当前Intent正在操作的数据。而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。

隐式Intent的用法三(使得当前的活动能够响应一个打开网页的Intent)

标签中再配置一个标签,用于更精确地指定当前活动能够响应什么类型的数据。标签中主要配置以下内容:
android :scheme。用于指定数据的协议部分,如http部分
android :host。用于指定数据的主机名部分。如www.baidu.com
android port。用于指定数据的端口部分,一般紧随在主机名之后。
android path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
android mimeType。用于指定可以处理数据的类型,允许使用通配符的方式进行指定。
只有标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能相应该Intent

<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
intent-filter>

Androidmanifest中的代码使得当前活动成为一个可以响应一个打开网页的Intent了。

隐式Intent的用法四(打开拨号界面,并附有号码)

Intent intent =new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

二、 Intent用于传递数据

Intent在活动之间传递数据的使用方法

—-向下一个活动传递数据

FirstActivity中的代码:

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="Hello World";
Toast.makeText(FirstActivity.this, "进入第二个活动中!",
Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);//第一个参数是键,用于后边从intent中取值,第二个参数是当前要进行传递的值
startActivity(intent);//执行此处的intent
}
});

SecondActivity中的代码

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
Intent intent=getIntent();//获取启动SecondActivity的intent
String data=intent.getStringExtra("extra_data");//由于我们传递的是字符串,所以使用getStringExtra()方法,如果传递的值是整形,则使用getIntgExtra()方法
if(data==null)
Toast.makeText(SecondActivity.this,"数据传递失败!",Toast.LENGTH_SHORT).show();
else
Toast.makeText(SecondActivity.this,data,
Toast.LENGTH_SHORT).show();
}

—-向上一个活动传递数据

一般情况下,我们需要返回上一个活动时,只需要按一下Back键就可以销毁当前活动,并返回上一个活动,并没有一个用于启动活动的Intent来传递数据。Activity中有一个startActivityForResult()方法也是用来启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
FirstActivity中的代码:

button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent("comyhyhte.example.lx.androidtest.ACTION_START");
intent.addCategory("comyhyhte.example.lx.androidtest.MY_CATEGORY");
startActivityForResult(intent,1);//第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源
}
});

SecondActivity中的代码

finish.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent();//仅仅用于传递数据
intent.putExtra("data_return","之前的活动已经被销毁了!");
setResult(RESULT_OK,intent);//该方法专门用于向上一个活动传递数据,该方法用两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或者RESULT_CANCELED第二个数据将带有数据的Intent传递了回去
finish();//销毁当前活动
}
});

由于我们在FirstActivity中使用了startActivityForResult()方法来启动SecondActivity,所以在SecondActivity被销毁之后会回调FirstActivity中的onActivityResult()方法

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode==RESULT_OK) {
String returnData = data.getStringExtra("data_return");
Toast.makeText(FirstActivity.this,returnData,Toast.LENGTH_SHORT).show();
}
break;
default:
}
}

onActivityResult()方法中有三个参数,第一个参数是requestCode即我们在启动活动时的请求码,第二个参数是resultCode即我们在返回数据时传入的处理结果。第三个参数是data即携带着返回数据的Intent。由于在一个活动中可能会通过startActivityForResult()启动许多不同的活动,而这些活动在被销毁时,都会回调onActivityResult()方法,因此我们首先要做的是通过检查requestCode的值来判断数据来源,然后在通过resultCode判断处理结果是否成功,最后从data中取值,并将所取值显示出来。
此时你可能会有疑惑,用户要是在销毁SecondActivity时并不是点击按钮finish而是点击Back键来销毁活动的,那么就不能做到将数据传递给上一个活动了,事实是这样的,但是我们可以对程序做稍微的修改,就可以再次将数据传递给上一个活动。
SecondActivity中重写onBackPressed()方法就可以了,代码如下:

public void onBackPressed() {
Intent intent=new Intent();//仅仅用于传递数据
intent.putExtra("data_return","之前的活动已经被销毁了!");
setResult(RESULT_OK,intent);//该方法专门用于向上一个活动传递数据,该方法用两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或者RESULT_CANCELED第二个数据将带有数据的Intent传递了回去
finish();//销毁当前活动
}

推荐阅读
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 用户视图(查看运行状态或其他参数)系统视图(配置设备的系统参数)system-viewEntersystemview,returnuservi ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
author-avatar
daoyuanzhi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有