android ——Intent
Intent是android程序中各组件之间进行交互的重要方式,它可以用于指明当前组件想要执行的动作,也可以在不同组件之间传递数据,Intent一般被用于启动活动,启动服务以及发送广播。
一、显式的使用Intent启动活动
Intent有多个构造函数的重载,其中有Intent(Context packageContext, Class<?>cls ),第一个参数Context指定了启动活动的上下文,第二个参数指定了想要启动的目标活动
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
先创建一个Intent对象,指定想要启动的目标活动,然后调用startActivity()方法根据参数intent对象启动这个活动。
二、隐式的使用Intent启动活动
隐式Intent它并不明确的指示想要启动那一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent再去启动合适的活动
先创建一个自定义action和category的活动在AndroidManifest中:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xbt.exp19"> <application
...
</activity>
<activity android:name=".Main2Activity">
<intent-filter>
<action android:name="XX"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application> </manifest>
这里随意设定了XXv这个action,然后android.intent.category.DEFAULT是一种默认的category,所以调用的时候:
Intent intent = new Intent("XX");
startActivity(intent);
Intent的参数就是一个XX的字符串,指定了想要启动的活动的action信息,然后startActivity()方法会自动的把默认的category信息添加到intent中
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xbt.exp19"> <application
...
</activity>
<activity android:name=".Main2Activity">
<intent-filter>
<action android:name="XX"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="ww"/>
<category android:name="xw"/>
</intent-filter>
</activity>
</application> </manifest>
这里额外添加了两个category,因为category是可以增加任意多个的,然后使用的时候:
Intent intent = new Intent("XX");
intent.addCategory("ww");
intent.addCategory("xw");
startActivity(intent);
这样使用就行,要注意的地方有:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xbt.exp19"> <application
...
</activity>
<activity android:name=".Main2Activity">
<intent-filter>
<action android:name="XX"/>
<category android:name="ww"/>
<category android:name="xw"/>
</intent-filter>
</activity>
</application> </manifest>
这样就会出错,因为startActivity()方法会自动的把默认的category信息添加到intent中所以category默认的那一个信息必须得加上,,不过我没查过资料,,反正我手机必须加上。。
然后使用一下系统设定的action:
Intent intent1 = new Intent(Intent.ACTION_VIEW);
intent1.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent1);
这样就能启动浏览器,并打开百度。
Intent intent2 = new Intent(Intent.ACTION_DIAL);
intent2.setData(Uri.parse("tel:10086"));
startActivity(intent2);
这样就能打开拨号盘,并且已经输入好10086。
三、使用Intent传递数据
1、向下一个活动传递数据
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("id",1);
intent.putExtra("name","名字");
intent.putExtra("age",20.5f);
startActivity(intent);
接收的时候:
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int id =intent.getIntExtra("id");
float age = intent.getFloatExtra("age");
发送的时候使用的putExtra()第一个参数相当于发送的数据的键,第二个参数是发送的实际值,接受的时候就是根据这个键,然后相应的类型要使用不同的方法接收数据。
2、返回数据给上一个活动
a、主活动中创建用于启动目标活动的Intent对象。
b、调用startActivityForResult()方法启动目标活动。
c、被启动的活动创建一个Intent对象,并调用putExtra()方法将要传递的数据存放在intent中。
d、调用setResult()方法返回数据,然后调用finish()销毁该活动。
e、在主活动中重写onActivityResult()方法,在其中保存接受到的数据
主活动中的启动目标活动的代码:
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
startActivityForResult()的第二个参数是一个请求码,要求是一个唯一值。
被启动的活动中的返回数据的代码:
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent();
intent.putExtra("data_return","first");
setResult(RESULT_OK,intent);
finish();
}
});
setResult()方法第一个参数用于向上一个活动返回处理结果,一般使用RESULT_OK或RESULT_CANCELED两个值,第二个参数把带有数据的Intent传递出去。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if (requestCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity",returnedData);
}
break;
default:
}
}
由于我们使用的startActivityForResult方法来启动SecondActivity的,在SecondActivity销毁后会回调上一个的onActivityResult方法,因此就需要重写这个方法
onActivityResult有三个参数,第一个参数是我们启动活动时传入的请求码,第二个参数resultCode即我们返回数据时传入的处理结果,第三个参量,即携带着返回数据的Intent。
在一个活动中我们可能利用startActivityForResult启动很多不同的活动,每一个返回的数据都会回调到onActivityResult这个方法中,我们首先要检查的就是requestCode的值来判断数据来源,再通过resultCode检查处理结果是否成功。
四、使用Intent传递对象
想要使用使用Intent传递对象就是要把对象序列化,变得可存储可传输的状态然后才能使用Intenti传输,目前有Serializable 和Parcelable两种方式,Serializable相对Parcelable实现简单,但是效率低一些。
Serializable:
假如有这样一个Fruit对象把它序列化:
public class Fruit implements Serializable {
private String name;
private int imageId;
public Fruit(String name,int imageId){
this.name = name;
this.imageId = imageId;
}
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
}
然后在活动中传递的时候:
Fruit fruit = new Fruit("orange",1)
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("fruit",fruit);
startActivity(intent);
在目标活动中:
Fruit fruit = (Fruit) getIntent().getSerializableExtra("fruit");
Parcelable:
这个就比较复杂了需要对整个对象进行分解
比如这样一个Fruit对象把它序列化
public class Fruit implements Parcelable {
private String name;
private int imageId;
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(imageId);
}
public static final Parcelable.Creator<Fruit> CREATOR = new Parcelable.Creator<Fruit>(){
@Override
public Fruit createFromParcel(Parcel parcel) {
Fruit fruit = new Fruit();
fruit.name = parcel.readString();
fruit.imageId = parcel.readInt();
return fruit;
}
@Override
public Fruit[] newArray(int i) {
return new Fruit[i];
}
};
}
重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。
还必须在Person 类中提供一个名为CREATOR 的常量,接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和Id字段,并创建一个fruit对象进行返回,其中name 和Id都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Fruit数组,并使用方法中传入的size 作为数组大小就可以了。
目标活动中这样写:
Fruit fruit = (Fruit) getIntent().getParcelableArrayExtra("fruit");
android ——Intent的更多相关文章
- android Intent介绍
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...
- android:Intent匹配action,category和data原则
1.当你在androidmanifest里面定义了一个或多个action时 你使用隐式意图其他activity或者service时,规定你隐式里面的action必须匹配XML中定义的action,可以 ...
- Android Intent
Intent在Android中的重要性不言而喻.本文主要总结下Intent使用过程中需要注意的一些问题. 1.隐式Intent AndroidManifest.xml声明时<intent-fil ...
- android intent和intent action大全
1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...
- Android总结篇系列:Android Intent
Intent在Android中的重要性不言而喻.本文主要总结下Intent使用过程中需要注意的一些问题. 1.隐式Intent AndroidManifest.xml声明时<intent-fil ...
- 什么时候加上android.intent.category.DEFAULT
什么时候加上android.intent.category.DEFAULT 1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent ...
- (转)android.intent.action.MAIN与android.intent.category.LAUNCHER
android.intent.action.MAIN决定应用程序最先启动的Activity android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 在网上看到 ...
- android之android.intent.category.DEFAULT的用途和使用
1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity , ...
- 理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER
刚才看了一下sundy的视频<LLY110426_Android应用程序启动>,里面讲到luncher这个activity通过获取应用程序信息来加载应用程序,显示给用户,其中就是通过一个应 ...
- Android Intent的几种用法全面总结
Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...
随机推荐
- django基础知识之视图:
视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图:
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 截图编辑器 PicPick Biz v4.1.6/v5.0.3 Lite 绿色便携版
下载地址:点我 PicPick 是由NGWIN 软件科技公司推出的一款实用的.多功能屏幕截图与图像编辑神器.软件具备屏幕截取.取色器.调色板.放大镜.标尺.量角器.坐标轴.白板等功能,支持全屏.活动窗 ...
- 包教包会之Open Live Writer设置代码样式
Open Live Writer(以下简称OLW),作为一个在本地写博文,然后发布到各个博客网站的客户端,在使用上个人觉得还是比较好用的.但是其对IT博文中代码部分的内容样式支持不是很友好.下面是本人 ...
- Bzoj 1997 [Hnoi2010]Planar题解
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2224 Solved: 824[Submit][Stat ...
- ~~函数基础(三):嵌套函数&匿名函数~~
进击のpython 嵌套函数&匿名函数 讲完作用域之后 对变量的作用范围有大致的了解了吗? 讲个稍微小进阶的东西吧 能够帮助你更加的理解全局和局部变量 嵌套函数 玩过俄罗斯套娃不? 没玩过听过 ...
- STM32F072从零配置工程-建立工程文件
快速建立工程有两种方法: 第一种是通过官方提供的外设库来搭建,好处是使用库函数,而不需要深入研究寄存器配置: 第二种是通过STM32CubeMX,好处是直观快速,可以直接帮你配置好功能和时钟,不过使用 ...
- 异步编程之Async,Await和ConfigureAwait的关系
在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然 ...
- 黑羽压测 比 jmeter、locust、loadrunner 更简便,性能更强
视频讲解 点击下方链接,观看 讲解视频 https://www.bilibili.com/video/av60089015/ 动机 目前市场上对API接口做性能测试工具有 Jmeter.LoadRun ...
- NOIp2018普及组T3暨洛谷P5017 摆渡车:题解
题目链接:https://www.luogu.org/problemnew/show/P5017 emm,这次的真的不简单的,T3比T4难? 醉了... 蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的 ...