android菜鸟学习笔记11----Intent的两点补充
关于Intent的两点补充:
1.隐式Intent启动组件,会有一个Intent解析的过程,若找不到能够处理该Intent的组件,程序就会异常终止。一个合理的做法是,在使用Intent实例启动组件如:startActivity(intent)之前,最好能判断一下该调用能否解析为一个Activity。为了实现该功能,Intent提供了一个方法:
ComponentName resolveActivity(PackageManager pm) :该方法接收一个包管理器对象作为参数,通过查找该包管理器,返回能够处理该Intent的Activity的Component对象,没有找到能处理该Inent的组件时则返回null。
Intent intent1 = new Intent(); intent1.setAction(Intent.ACTION_VIEW); intent1.setType("text/html"); Log.i("tag",intent1.toString()); ComponentName resolveActivity = intent1.resolveActivity(getPackageManager()); Log.i("tag",resolveActivity.getClassName()); Log.i("tag",resolveActivity.getPackageName()); Log.i("tag",resolveActivity.toString()); startActivity(intent1);
NormalActivity中配置<intent-filter>
<activity android:name=".NormalActivity"> <intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/html"/> </intent-filter> </activity>
运行信息:
可见解析到cn.csc.lifecycle.NormalActivity能够处理该Intent。
若找不到能够处理该Intent的组件时,会返回null,所以,安全的启动Activity的做法是:
if(intent1.resolveActivity(getPackageManager())!=null){ startActivity(intent1); }
当然,可以加上找不到能处理intent1的组件的提示信息等。
注意,若用多个组件都能处理该Intent实例时,如:
Intent intent1 = new Intent(); intent1.setAction(Intent.ACTION_VIEW); intent1.setData(Uri.parse("http://www.baidu.com")); Log.i("tag",intent1.toString()); ComponentName resolveActivity = intent1.resolveActivity(getPackageManager()); Log.i("tag",resolveActivity.toString()); startActivity(intent1);
<activity android:name=".NormalActivity"> <intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http"/> </intent-filter> </activity>
此时,浏览器和NormalActivity都能处理该Intent实例。
运行效果:
返回的Component信息为:
这个ResolverActivity其实就是一个选择打开程序的对话框,当有多个组件能处理Intent实例,但是没有设置默认的处理程序时,就会交由ResolverActivty来处理,而ResolverActivity的做法就是把所有能处理的都显示在一个列表中,由用户决定采用哪个来处理。当我们勾选了下面的use by default for this action时,之后选择的组件将会作为该Intent的默认处理程序,该设置会保存在手机或者模拟器中,下次在出现该Intent时,直接使用设置的默认组件去处理,而不再转到ResolverActivity。
如,这里我选择了Browser作为默认处理程序,下次再启动改程序,输出的运行信息:
2.关于使用Intent在Activity之间传递数据,在之前都是传递些内置类型的数据,若想传递自定义类型的数据,应该怎么办呢?
注意到在Intent中有下面两对方法:
Serializable getSerializableExtra(String name)
Intent putExtra(String name, Serializable value)
放入/获取Serializable类型的值。
<T extends Parcelable> T getParcelableExtra(String name)
Intent putExtra(String name, Parcelable value)
放入/获取Parcelable类型的值。
Serializable和Parcelable都是接口,即要想使用Intent传递自定义类型的数据,则自定义类型的数据应当事先Serializable接口或者Parcelable接口。
Serializable接口:
java.io.Serializable是一个空的起到标记作用的接口。标记实现该接口,只需要在类定义时声明实现该接口即可。实现该接口的类表明能够被序列化和反序列化,对大多数的类来说已然足够了,当然,若想更细粒度的操纵序列化过程,可以实现下面这两个方法:
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
一般情况下,都用不到的。
这里简单声明实现该接口,如:
import java.io.Serializable; public class MyData implements Serializable { private String stringData; private int intData; public MyData(String stringData, int intData) { super(); this.stringData = stringData; this.intData = intData; } public String getStringData() { return stringData; } public void setStringData(String stringData) { this.stringData = stringData; } public int getIntData() { return intData; } public void setIntData(int intData) { this.intData = intData; } }
之后,便可以传递MyData类型数据了:
MyData data1 = new MyData(“aaa”,111); Intent intent1 = new Intent(); intent1.putExtra(“mydata”, data1);
取得该数据:
MyData data1 = (MyData)getIntent.getSerializableExtra(“data1”);
Parcelable接口:相比Serializable要复杂一点,需要实现里面的抽象方法。
android.os.Parcelable接口,帮助文档中,有一个典型的实现例子如下,可以用作参考,自己实现该接口时,模仿即可:
public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } }
定义各种内置类型的数据,然后在writeToParcel分别根据不同的类型调用对应类型的
out.writeXXX(mData);在构造方法中,分别调用in.readXX()即可。
然后就可以调用Intent putExtra(String name, Parcelable value)去放入该自定义类型数据,调用<T extends Parcelable> T getParcelableExtra(String name)获取该自定义类型数据。
android菜鸟学习笔记11----Intent的两点补充的更多相关文章
- Android开发学习笔记:Intent的简介以及属性的详解【转】
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
- 【转载】Android开发学习笔记:Intent的简介以及属性的详解
http://liangruijun.blog.51cto.com/3061169/634411/ 一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent ...
- android菜鸟学习笔记26----Android广播消息及BroadcastReceiver
1.广播类型: Android中的广播有两种类型:标准广播和有序广播.其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦 ...
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...
- android菜鸟学习笔记2----关于adb
adb : android debug bridge android调试桥 路径:adt-bundle目录/sdk/platform-tools/adb.exe 常见的adb命令: adb devic ...
- android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图
1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...
- android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现
Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: ...
- android菜鸟学习笔记27----Fragment的简单使用
1.Fragment的生命周期: 简单在新建一个MyFragment继承自Fragment,重写各个生命周期回调方法,各个方法中直接输出标识相关函数被调用的信息. 重写MainActivity的各个生 ...
- android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据
主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...
随机推荐
- tomcat7.0.55配置HTTP强制跳转到HTTPS
首先需要配置好HTTPS单向或双向链接 参考: tomcat7.0.55配置单向和双向HTTPS连接(二) 然后编辑tomcat的conf目录下的web.xml 在<welcome-file-l ...
- 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)
1.业务场景 保险人管系统每月工资结算,平安有150万代理人,如何快速的进行工资结算(数据运算型) 保险短信开门红/电商双十一 1000w+短信发送(短时汇聚型) 工作中业务场景非常多,所涉及到的场景 ...
- [AHOI2005] SHUFFLE 洗牌
1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 952 Solved: 630[Submit][St ...
- Java获取路径的方法分析详解(Application/Web)
1.利用System.getProperty()函数获取当前路径: System.getProperty("user.dir");//user.dir用户当前的工作目录,输出:D: ...
- 防止ddos攻击
1.防止ddos攻击 :接入层过滤器,去判断非法请求ip地主(如果请求过多,自己加入黑名单),上传至防火墙黑名单,不再录入 2.防止xss/css攻击 :在接入层,有第三方jra包工具类,过滤所有请求
- wxWidgets界面开发工具wxFormBuilder的使用
wxFormBuilder 下载地址:http://download.csdn.net/detail/lsmallstop/7013401 安装完成后,打开wxFormBuilder,可以在左侧工程子 ...
- PE经典DIY案例1:全解开方案让量产PE也能
更新说明:因未来的uefi似乎并不能识别并引导ud区,但能识别和引导量产和u+B+隐藏或高端隐藏区,故解决量产PE对u+B+隐藏区的支持,并增加对UEFI启动支持,已经成为PE制作的最主流技术. PE ...
- implement-stack-using-queues(easy,但也有思考价值)
https://leetcode.com/problems/implement-stack-using-queues/ 还有种方法,就是利用同一个队列,知道队列长度前提下,把内容从头到尾,再向尾部依次 ...
- 微信小程序 - 时间戳转时间
获取当前时间:十位unix时间戳 var timestamps = Math.round(new Date().getTime() / 1000).toString(); 时间戳转时间(官方自带) 使 ...
- UNP学习笔记(第二十六章 线程)
线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还 ...