关于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的两点补充的更多相关文章

  1. Android开发学习笔记:Intent的简介以及属性的详解【转】

    一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...

  2. 【转载】Android开发学习笔记:Intent的简介以及属性的详解

    http://liangruijun.blog.51cto.com/3061169/634411/ 一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent ...

  3. android菜鸟学习笔记26----Android广播消息及BroadcastReceiver

    1.广播类型: Android中的广播有两种类型:标准广播和有序广播.其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦 ...

  4. android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结

    常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...

  5. android菜鸟学习笔记2----关于adb

    adb : android debug bridge android调试桥 路径:adt-bundle目录/sdk/platform-tools/adb.exe 常见的adb命令: adb devic ...

  6. android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图

    1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...

  7. android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现

    Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: ...

  8. android菜鸟学习笔记27----Fragment的简单使用

    1.Fragment的生命周期: 简单在新建一个MyFragment继承自Fragment,重写各个生命周期回调方法,各个方法中直接输出标识相关函数被调用的信息. 重写MainActivity的各个生 ...

  9. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

随机推荐

  1. K均值聚类(C++)

    #include<math.h> #include<stdio.h> #include<stdlib.h> #include<iostream> usi ...

  2. HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】

    火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站 ...

  3. Bootstrap多层模态框modal嵌套问题

    一.问题 在项目里忽然新加了一个需求,在原本弹出的模态框里,点击模态框里面的按钮再弹出一个模态框,出来另个模态框来展示详细信息.此时就存在两个模态框在这个需求没加之前有一个弹出的模态框也是需要继续点击 ...

  4. UVA 10827 Maximum sum on a torus 最大矩阵和

    题目链接:UVA - 10827 题意描述:给出一个n*n矩阵,把第一行和最后一行粘一起,把第一列和最后一列粘一起,形成一个环面,求出这个环面中最大的矩阵和. 算法分析:首先复制n*n这个矩阵,形成由 ...

  5. php从数据库选取记录形成列表(首页调用)

    <ul class="e1"> <?php $querySel = "select ID,Tit,Addtime from news where DSh ...

  6. mac 安装 redis

    安装命令 brew install redis 开机启动redis命令 $ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents 使用 ...

  7. 2017.2.12 开涛shiro教程-第八章-拦截器机制

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 1.拦截器介绍 下图是shiro拦截器的基础类图: 1.Namea ...

  8. 转: Syslog协议介绍

    转: http://liu-hliang.iteye.com/blog/827392 在网上搜的文章,写的很全乎.摘抄如下,供大家参考学习 1.介绍 在Unix类操作系统上,syslog广泛应用于系统 ...

  9. 使用Shiro

    一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使用.但是最常用的环境还是JavaEE.下面以 ...

  10. dubbo zookeeper案例

    Alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...