android 基础03 -- Intent
Android 中的 Intent 是将要执行的操作的一种抽象的描述,是一个用于Android 各个组件之间传递消息的对象。
Intent 的基本用法
Intent 基本的使用方法主要有三种:
启动一个新的 Activity 实例。
通过将 Intent 传入startActivity()中可以启动一个新的实例,其中的 Intent 描述了要启动的 Activity,并包含了一些必要的数据启动一个服务
通过将 Intent 传入startService()中可以启动一个服务器执行一些一次性的操作(如下载文件等)。其中的 Intent 描述了要启动的服务,并包含了一些必要的数据。发送广播
广播指那些所有应用都可以接受的消息,通过将 Intent 传递给sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),可以将广播传递给其他应用。
Intent 的类型
Intent 可以分为两种类型:
显式Intent(Explicit Intents)
通过完全限定类名来指定要启动的组件。当明确的知道要启动的 Activity或 Service 的名称时可以使用显式的 Intent。例如,启动一个 Activity 或 Service 去响应用户的操作。创建显式 Intent 启动 Activity 或 Service,系统会立即启动 Intent 指定的组件。隐式 Intent(Implicit Intents)
不指定特定的组件,而是声明要执行的操作,从而允许其它的组件来处理。例如发送一个 E-mail,则可以使用隐式的 Intent,允许其它的应用来处理该操作。
显式 Intent的使用
下面的代码表示,当点击按钮 Next 时,启动一个显式的 Intent,转向一个指定的页面
Button Next = (Button)findViewById(R.id.Next);
Next.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(firstActivity.this,secondActivity.class);
startActivity(intent);
}
});
隐式 Intent 的使用
下面的代码,当点击按钮 Broswer 时,启动一个隐式的 Intent,打开一个 Web 页面
Broswer Next = (Button)findViewById(R.id.Broswer);
Next.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.Parse("http://www.baidu.com");
startActivity(intent);
}
});
创建隐式的 Intent时,Android 系统将 Intent 中指定的内容与设备上其它应用的 AndroidManifest.xml 中声明的 Intent-filter 进行比较,如果 Intent 与声明的 Intent-filter 匹配,则启动对应的组件,并将 Intent传递给它。如果存在多个 intent-filter匹配,则提供一个选择器供用户选择使用哪个应用来处理。
注意:显式的 Intent 总是能够传递给它的目标,而不管目标组件的 intent-filter 是如何定义的

用户可能没有任何应用可以处理你发送到 startActivity 的隐式 Intent,如果出现这种情况,则调用会失败,且 应用会崩溃 ,因此,在发出一个隐式的 Intent 之前最好验证一下当前设备是否具有可以处理该 Intent 请求的应用。可以调用 Intent 对象的 resolveActivity() 来验证,如果方法返回 null,则说明当前设备没有可以处理该 Intent 的应用,必要情况下应该停止发出此 Intent,如果 返回不为空,则表示至少存在一个可以处理该 Intent的应用。
注意:Android 官方建议,通过显式的 Intent 来启动服务,并且不要为服务声明 Intent-Filter,因为使用隐式的 Intent 启动服务时,无法确定响应 Intent* 的服务,用户也无法看到启动的服务,存在一定的安全隐患。在 Android 5.0 开始,使用隐式的 Intent 调用
bindService()将会发生异常。
接收隐式的 Intent
要声明应用可以处理哪些隐式的 Intent,需要在 AndroidManifest.xml 中使用 intent-filter 属性为组件声明一个或多个 intent 过滤器,每个 intent 过滤器都可以根据 Intent 的操作、数据和类别指定自身接收的 Intent。仅当隐式的 Intent 匹配某一 Intent的规则时,Android 系统才会将 隐式的 Intent 传递给应用组件。如果一个组件没有声明任何的 Intent 过滤器,那么它只能通过显式Intent 的方式启动。
每个 Intent 过滤器均由 AndroidMainfest.xml 中的 intent-filter 属性标签来定义,并嵌套在响应的最近中(例如 Activity)
<Activity android:name=".second">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<catetory android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
</intent-filter>
</Activity>
intent-filter 中可以使用的属性
action
在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。data
使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。data 标签内的 scheme等几个属性均为可选,但存在线性依赖关系,具体如下:
1. 如果未指定 scheme 则忽略 host
2. 如果未指定 host 则忽略 port
3. 如果未指定 scheme 和 host,则忽略 path
- category
在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
在定义 intent-filter 时,我们可以使用上述属性中的一个或多个进行任意的组合,系统通过将
Intent 与 intent-filter 中定义的属性规则进行测试,只有通过所有的测试时,才会将 Intent 传递给该组件。
注意:使用 Intent 过滤器时,无法安全地防止其他应用启动组件。如果需要保证只有自己的应用可以访问应用内部的某些组件,可以针对该组件将其 exported 属性设置为 false
使用 Intent 在 Activity 间传递数据
使用 Intent 向下一个 Activity 传递数据
下面的例子,当我们点击 Next 按钮时,将输入框的值传入下一个 second 页面
Button btn = (Button)findViewById(R.id.Next);
final EditText UName = (EditText)findViewById(R.id.UName);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent transferData = new Intent(MainActivity.this,second.class);
transferData.putExtra("data",UName.getText().toString());
startActivity(transferData);
}
});
在 second 页面中,我们可以通过以下的方式来获取传入的数据
Intent intent = getIntent();
String UName = intent.getStringExtra("data");
使用 Intent 回传数据给上一个 Activity
有时候我们希望启动一个新的 Activity 来处理一些数据,然后可以回传处理结果到当前的 Activity,这是我们便可以通过 Activity 的 startActivityForResult 来实现。
下面的例子,在第一个 Activity 中点击按钮时将文本框中的内容传入一个新的 Activity,在第二个 Activity 中对第一个 Activity 传过来的内容进行处理,然后回传给第一个 Activity。
第一个 Activity:
Button btn = (Button)findViewById(R.id.Click);
final EditText UName = (EditText)findViewById(R.id.UName);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(MainActivity.this,second.class);
intent.putExtra("data",UName.getText().toString());
startActivityForResult(intent,1);//第二个参数表示一个请求码,必须唯一
}
});
第二个 Activity
Button SayBtn = (Button)findViewById(R.id.Say);
SayBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
String UName = getIntent().getStringExtra("data");
Intent intent = new Intent();
intent.putExtra("return_data","我明白了,你的名字为: " + UName + "很高兴认识你");
setResult(RESULT_OK,intent);
finish();
}
});
重写第一个 Activity 的 onActivityResult 方法,该方法会在第二个 Activity 销毁后调用
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:{
if(resultCode == RESULT_OK){
String replyData = data.getStringExtra("return_data");
Toast.makeText(this,replyData,Toast.LENGTH_SHORT).show();
}
}
break;
}
}
在这里我们便可以接收到第二个 Activity 处理后的数据了。
android 基础03 -- Intent的更多相关文章
- Android 基础知识 -- Intent
Intent (意图) Android通信的桥梁,可以通过Intent启动Activity , Service , 发送指定广播到Receiver <1> 启动Activity : sta ...
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- Android基础总结(8)——服务
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...
- Mono.Android 基础
Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...
- Android中的Intent详解
前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面.因为每一个Acticity的任务不一样,所以经常互在各个Activi ...
- 基础4 Android基础
基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...
- Android基础总结+SQlite数据库【申明:来源于网络】
Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...
- android基础---->service的生命周期
服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...
- android基础---->IntentService的使用
这一篇博客,我们开始前台服务与IntentServie源码分析的学习,关于service的生命周期及其简单使用,请参见我的博客:(android基础---->service的生命周期) 目录导航 ...
随机推荐
- Ruby学习之对象模型
这两周工作内容较多,平时自己也有点不在状态,学的东西有点少了,趁着现在还有点状态,赶紧复习一下之前学习的Ruby吧. Ruby是我真正开始接触动态语言魅力的第一个语言,之前虽然也用过且一直用perl. ...
- commons-dbutils 字段名称转换
我们在写bean的时候,字段通常都使用小驼峰命名法,但是在设计数据库时,一般使用下划线分割命名.这样,在取出数据库字段时,还需要转换.如何简洁的实现这种转换呢? 你能遇到的问题,只要是普遍存在的,大家 ...
- 安卓电量优化之WakeLock锁机制全面解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.WakeLock概述 wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态.比如,手机屏幕在屏幕关闭 ...
- 最新版Solr 7.2安装配置
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- 扩充表字段长度,引发的意外KILLED/ROLLBACK
这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度. ) --修改字段长度sql 在执行的时候,有这样一个情况. 例如Student表的Name字段长度是n ...
- 如何将nupkg文件安装到VS2017
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 系统:Win10 X64 一.首先在https://www.nuget ...
- windows系统安装securtCRT
说明:securtCRT可以ssh liunx主机,或者网络设备,如路由器,交换机,防火墙等设备,很多新手不会安装,因为正版要钱啊,对于小老百姓,还是用破解的吧 不说废话,开始搞起来. 软件下载链接: ...
- python 版本管理工具 pyenv 使用备忘
安装步骤 安装 xcode-select 以及 homebrew(前者在安装 git 的时候装过,后者 mac 开发必备无需解释) 安装 pyenv brew install pyenv,用 pyen ...
- 明星单品tab
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- windbg指定SOS版本,执行扩展命令报错
调试dump文件,加载相匹配版本的sos/clr时,绝大多数都是可以正常使用的. 然而凡事都有例外,今天在做类似工作时,遇到了错误: CLRDLL: Consider using ".cor ...