山东青岛安卓培训就业中心 专业Android软件工程师培训,手机软件开发人才就业实训中心0532-85025005

Android开发指南-框架主题-基础知识应用程序基础——应用程序组件(四)

 

启动任务

当一个activity被指定一个“android.intent.action.MAIN”做为动作,以及“android.intent.category.LAUNCHER”做为类别的intent过滤器之后(在前述intent过滤器一节中已经有了这个示例),它就被设置为一个任务的入口点。这样的过滤器设置会在应用程序加载器中为此activity显示一个图标和标签,以供用户加载任务或加载之后在任意时间回到这个任务。

Android开发指南-框架主题-基础知识应用程序基础——应用程序组件(三)

 

如前所述,一个activity可以启动另外一个,甚至包括与它不处于同一应用程序之中的。举个例子说,假设你想让用户看到某个地方的街道地图。而已经存在一个具有此功能的activity了,那么你的activity所需要做的工作就是把请求信息放到一个Intent对象里面,并把它传递给startActivity()。于是地图浏览器就会显示那个地图。而当用户按下BACK键的时候,你的activity又会再一次的显示在屏幕上。

Android开发指南-框架主题-基础知识应用程序基础——应用程序组件(二)

 

激活组件:intent

当接收到ContentResolver发出的请求后,内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对象。对于activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。比如说,它可以承载对一个activity的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent对象指明了声明的行为。比如,它可以对所有感兴趣的对象声明照相按钮被按下。

Android开发指南-框架主题-基础知识应用程序基础——应用程序组件

 

Android的核心功能之一就是一个应用程序可以使用其它应用程序的元素(如果那个应用程序允许的话)。比如说,如果你的应用程序需要一个图片卷动列表,而另一个应用程序已经开发了一个合用的而又允许别人使用的话,你可以直接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸纳或链接其它应用程序的代码,它只是在有需求的时候启动了其它应用程序的那个功能部分。

意图和意图过滤器Intents and Intent Filters

 

一个应用程序的三个核心组件-活动,服务和广播接收器是通过消息即意图(Intents)来激活的。Intent消息传送是相同或不同应用中组件运行时晚绑定的一种机制。意图本身,一个意图对象,是一个包含被执行操作抽象描述的被动的数据结构-或者,对于广播而言,是某件已经发生并被声明的事情的描述。存在不同的机制来传送意图到每种组件中:

Android开发--详解SharedPreference/PreferenceActivity

我们经常看到应用程序的设置页面,一般用到设置页面时,我们会继承自PreferenceActivity,它实现了SharedPreference,并生成相应的XML文件自动保存用户的设置,在设置页面中,每一个列表项都是一个Preference,如果要实现点击某一项有所反应,就需要实现OnPreferenceChangeListener接口,并使得某一个Preference绑定一个监听器,下面的截图是作者实现的一个设置界面:

Android开发--PreferenceActivity中打开子PreferenceScreen黑屏的解决办法

如果你使用过设置界面,你会很清楚这个主题讲的是什么内容,当你在点击一个设置项之后,跳到另外一个子设置项,你会发现,你看不到任何东西,因为背景是黑色的,所以本文内容讲解的就是这个问题的解决办法,先看运行实例的截图:

android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)

第一、四大组件间数据传递方式:
启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。
其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:
putExtra和getExtra 其实是和Bundle put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量
所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。
所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。
Intent  putExtra方法:
Intent  putExtra(String name, Bundle value)
Intent  putExtra(String name, Parcelable[] value)
Intent  putExtra(String name, Serializable value)
Intent  putExtra(String name, Parcelable value)
Intent  putExtra(String name, int[] value)
Intent  putExtra(String name, float value)
Intent  putExtra(String name, byte[] value)
Intent  putExtra(String name, long[] value)
Intent  putExtra(String name, float[] value)
Intent  putExtra(String name, long value)
Intent  putExtra(String name, String[] value)
Intent  putExtra(String name, boolean value)
Intent  putExtra(String name, boolean[] value)
Intent  putExtra(String name, short value)
Intent  putExtra(String name, double value)
Intent  putExtra(String name, short[] value)
Intent  putExtra(String name, String value)
Intent  putExtra(String name, byte value)
Intent  putExtra(String name, char[] value)
Intent  putExtra(String name, CharSequence[] value)
Intent  putExtras(Intent src)
Intent  putExtras(Bundle extras)
Intent  putIntegerArrayListExtra(String name, ArrayList<Integer> value)
Intent  putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)
Intent  putStringArrayListExtra(String name, ArrayList<String> value)

Intent getExtra方法:
double[]  getDoubleArrayExtra(String name)
double  getDoubleExtra(String name, double defaultValue)
Bundle  getExtras()
int  getFlags()
float[]  getFloatArrayExtra(String name)
float  getFloatExtra(String name, float defaultValue)
int[]  getIntArrayExtra(String name)
int  getIntExtra(String name, int defaultValue)
ArrayList<Integer>  getIntegerArrayListExtra(String name)
long[]  getLongArrayExtra(String name)
long  getLongExtra(String name, long defaultValue)
Parcelable[]  getParcelableArrayExtra(String name)
<T extends Parcelable> ArrayList<T>  getParcelableArrayListExtra(String name)
<T extends Parcelable> T  getParcelableExtra(String name)
Serializable  getSerializableExtra(String name)
short[]  getShortArrayExtra(String name)
short  getShortExtra(String name, short defaultValue)
String[]  getStringArrayExtra(String name)
ArrayList<String>  getStringArrayListExtra(String name)
String  getStringExtra(String name)

Intent 的mExtras对象:
   private Bundle mExtras;

   public Intent putExtra(String name, Parcelable value) {
       if (mExtras == null) {
           mExtras = new Bundle();
       }
       mExtras.putParcelable(name, value);
       return this;
   }


第二、自定义对象的传递:
通过intent 传递自定义对象的方法有两个,第一是实现Serialization接口,第二是实现Parcelable接口。
首选推荐Parceable,android中的很多数据类型都是实现Serialable接口方式来传递的,例如 Intent、Bundle、Bitmap、Uri等等。
android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel
Parcelable:一个规范接口,定义实现Parcelable需要实现的功能
Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。

Parcelable实现要点:需要实现三个东西
1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc
2)describeContents方法。没搞懂有什么用,反正直接返回0也可以
3)静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcel in) 实现从in中创建出类的实例的功能
newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。
android doc示例代码: