Configuration类专门用来描述手机设备上的配置信息
Configuration cfg=getResources().getConfiguration();
public float fontscale :获取当前用户设置的字体的缩放因子
public int keyboard:获取当前设备所关联的键盘类型。
public int keyboardhidden:该属性返回一个boolean用于标识当前键盘是否可用。该属性不仅会判断系统的硬件键盘,也会判断系统的软键盘
public locale locale :获取用户当前的locale。
public int mcc:获取移动信号的国家码。
public int navigation:判断系统上方向导航设备的类型。
public int orientation:获取系统屏幕的方向
public int touchscreen:获取系统触摸屏的触摸方式。
安卓的消息传递机制是一种形式的事件处理。这种机制主要是为了解决安卓应用的多线程问题。安卓平台不允许activity新启动的线程访问该activity里面的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。但实际安卓应用开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性改变界面组件的属性值。需要借助handler的消息机制。
handler类包含如下方法用于发送、处理消息
void handlemesssage(Message msg):处理消息方法
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息
final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
多个重载的Message obtainMessage():获取消息
sendEmptyMessage(int what) :发送空消息
finale boolean sendEmptyMessageDelayed(int what,long delayMills):指定多少毫秒之后发送空消息
final boolean sendMessage(Message msg):立即发送消息
activity类间接或直接继承了Context,ContextWrapper、ContextThemeWrapper等基类。因此activity可以直接调用它们的方法。
LacuncherActivity继承了listactivity,它本质上也是一个开列表界面的activity,但它开发出来的列表界面与普通列表界面有所不同。它开发出来的列表界面中的每个列表项都对应于一个intent,因此当用户单击不同的列表项时,应用程序会自动启动对应的activity。
PreferenceActity是一个非常有用的基类。当我们开发一个安卓应用程序时,不可避免地需要进行选项设置,这些选项设置会以参数的形式保存,习惯上我们会用Preferences进行保存。
需要指出的是,如果安卓应用程序中包含某个activity专门用于设置选项参数,安卓为这种activity提供了便捷的基类:preferenceactity。
使用PrefenceActivity有一点与众不同的是:不在使用普通的界面布局文件,Preferenceactivity所使用的界面布局文件有点与众不同,它的界面布局文件不再使用普通layout作为根元素,而是使用Preferences作为根元素,它表明定义一个参数设置的界面布局。
activity启动其他activity有如下两个方法。
1、startactivity(Intent intent) :启动其他acitivty
2、startactivityforresult(Intent intent, int requestCode):以指定请求码(requestCode)启动activity,而且程序将会等到新启动activity的结果(通过重写onactivityResult()方法来获取)。
Starting Activities and Getting Results
The
startActivity(Intent)
method is used to start a new activity, which will be placed at the top of the activity stack. It takes a single argument, an Intent
, which describes the activity to be executed.
翻译:startActivity(Intent)这个方法是用来开启一个新的activity,将会被放在activity栈顶,它将携带一个变量,一个intent,用来描述哪个activity来执行。
Sometimes you want to get a result back from an activity when it ends. For example, you may start an activity that lets the user pick a person in a list of contacts; when it ends, it returns the person that was selected. To do this, you call the
startActivityForResult(Intent, int)
version with a second integer parameter identifying the call. The result will come back through your onActivityResult(int, int, Intent)
method.
翻译:有时当一个activity结束时,我们想要它的返回值。例如,你可能开启一个activity,然后让用户从一个列表联系中选择一个人;当它结束的时候,它返回了那个被选择的人,为了完成这个,你可以调用
startActivityForResult(Intent, int)这个办法,用第二个Integer参数来判断是哪个一个来访。结果将会返回,通过你的
onActivityResult(int, int, Intent)
方法。
When an activity exits, it can call
setResult(int)
to return data back to its parent. It must always supply a result code, which can be the standard results RESULT_CANCELED, RESULT_OK, or any custom values starting at RESULT_FIRST_USER. In addition, it can optionally return back an Intent containing any additional data it wants. All of this information appears back on the parent's Activity.onActivityResult()
, along with the integer identifier it originally supplied.
翻译:当一个activity退出的时候,它将会回调setresults方法来返回数据到它的父布局。它一定提供一个结果码,结果码是一个标准的结果,结果中断,结果成功,或者任何正式的结果以result 第一个用户来开头。另外,它可以随意返回一个intent包含任何额外它想要的数据。所有的这些信息都是会显示在它的父布局的onactivityresult方法中,并用integer来判断它起始的提供。
If a child activity fails for any reason (such as crashing), the parent activity will receive a result with the code RESULT_CANCELED.
翻译:如果一个子activity因为任何原因失败了,它的父布局将会收到一个结果,并且结果码为RESULT_CANCELED。
当一个activity启动另一个acitivity时,常常会有一些数据需要传过去—这就像web应用从servlet跳到另一个servlet时,Web应用习惯把需要交换的数据放入requestScope,sessionScope中。对于acitivity而言,在acitivity之间进行数据交换更简单:因为两个阿activity之间本来就有一个信使:Intent,因此我们主要将需要交换的数据放入Intent即可。
Intent提供了多个重载的方法来携带额外的数据。
putExtras(Bundle data):向Intent中放入需要“携带”的数据
上面方法中的Bundle就是一个简单的数据携带包,该Bundle对象包含了多个方法来存入数据。
putxxx(String key,XXX data):向Bundle放入int 、long等各种类型的数据
putSerializable(String key ,Serializable data):向Bundle中放入一个可序列化的对象
为了取出Bundle数据携带包里的数据,Bundle提供了如下方法。
getXxx(String key):从Bundle取出Int、Long等各种类型的数据。
getSerializable(String key,Serializable data):从bundle取出一个可序列化对象。
activity还提供了一个startactivityforresult(Intent intent,int requestCode)方法来启动其他acitivity。该方法用于启动指定activity,而且期望获取指定activity返回的结果。
例如应用程序第一个界面需要用户进行选择—但需要选择的列表数据比较复杂,必须启动另一个activity让用户选择。当用户在第二个activity选择完成后,程序返回第一个activity,第一个activity必须能获取并显示用户在第二个acitity选择的结果。在这种应用场景下,也是通过Bundle进行数据交换的。
为了获取被启动的activity所返回的数据,当前activity需要重写onActivityResult(int requestCode,int resultCode, Intent intent),其中requestCode代表请求码,而resultCode代表activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。
一个activity中可能包含多个按钮,并调用多个startactivityforresult()方法来打开多个不同的activity处理不同的业务,当这些新的activity关闭后,系统都会调用前面activity的onActivityResult(int requestCode ,int resultCode,Intent data)方法。为了知道该方法是由哪个请求的结果所触发的。可利用requestCode请求码:为了知道返回的数据来自于哪个新的activity,可利用resultCode结果码。
所谓回调,在实现具有通用性质的应用框架时非常常见:对于一个具有通用性质的程序架构来说,程序架构完成整个应用的通用功能、流程,但在某个特定的电商,需要一段业务相关的代码—通用的程序架构无法实现这段代码,那么程序结构会在这个点上留一个空。
对于java程序来说,程序架构在某个点上留得“空”,可以以如下两种方式存在。
1、以接口形式存在:该接口由开发者实现,实现该接口时将会实现该接口的方法,那么通用的程序架构就会回调该方法来完成业务相关的逻辑。
2、以抽象方法的形式存在:这就是activity的实现形式。这些特定的点上方法已经被定义了,如onCreate,onActivityResult等方法,开着可以选择性重写这些方法,通用的程序结构就会回调该方法完成业务相关的处理。
当开发者开发一个组件时,如果开发者需要该组件能响应特定的事件,也选择性实现该组件的特定方法,当用户在该组件上激发某个事件时,该组件上特定的方法就会回调。
Activity的回调机制也是与此类似,当activity被部署在安卓应用中之后,随着应用程序的运行,acitivity会不断地在不同的状态之间切换,该activity中特定的方法就会被回调—开发者就可以选择性重写这些方法来加入业务相关的处理。
当activity在安卓应用中运行时,它的活动状态由安卓以activity栈的形式管理,当前活动的activity位于栈顶。
归纳起来activity会经过如下四个状态:
1、活动状态:当前acitivty位于前台,用户可见。
2、暂停状态:其他activity位于前台,该activity依然可见,只能不能获得焦点。
3、停止状态:该activity不可见,失去焦点。
4、销毁状态:该activity结束,或acitivty所在的davlvik进程被结束。
Intent封装安卓应用程序需要启动某个组件的意图。不仅如此,Intent还是应用程序组件之间通信的重要媒介,两个activity可以把需要交换的数据封装成bundle对象,然后使用intent携带intent对象,这样就实现了两个activity之间的数据交换。
Intent
Componetn属性需要接受一个ComponetName对象,ComponentName对象包含如下几个构造器。
ComponentName(String pkg,String cls):创建pkg所在包下的cls类对应的组件。
ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件
ComponentName(Context pkg,Class<?>cls):创建pkg所对应的包下的cls类所对应的组件。
Intent的action,category属性都是一个普通的字符串,其中action代表该Intent所要完成的一个抽象动作,而Category则用于为acition增加额外的附加信息,通常action属性会与category属性结合使用。
<intent-filter../>元素是安卓清单配置文件中<activity../>元素的子元素,前面已经介绍过,<activity../>元素用于为应用程序配置Activity,<activity../>的<intent-filter../>子元素则用于配置该activity所能相应的Intent。
<intent-filter../>元素通常包含如下子元素:
0-N个<action../>子元素 0-N个《category../》子元素 0-1个<data../>子元素
一个Intent对象最多只能包括一个action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(String str )方法来为Intent 添加 Category属性。当程序创建Intent时,该Intent默认启动Category属性值为Intetn.GATEGORY_DEFAULT常量的组件。
Data Type属性与intent-filter配置
Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象,一个Uri对象通过如下形式的字符串来表示:
content://com.android.contacts/contacts/1
tel:123
上面两个字符串的冒号前面大致指定了数据的类型,冒号后面的数据部分。因为一个合法的Uri对象既可决定操作哪种类型的数据,又可指定具体的数据值。
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,例如前面之前的“vnd.android.cursor.item/phone”字符串。通常来说,当Intent不指定Data属性时,Type属性才会起作用。
实际上Data属性值可分为两个部分:数据类型和数据部分。例如前面看到的content://com.android。contact/contacts/1,它可分为如下两个部分:
content:前缀,该前缀表名该数据类型为联系人信息。
//com.android.contacts/contacts/1:该数据表明操作id为1的联系人数据。
一旦Intent同时指定了Action,Dat属性,那么Android将可根据指定的数据类型来启动特定的应用程序,并对指定数据执行相应的操作。
下面是几个Action属性、Dat属性的组合:
Action_View content://com.android.contacts/contacts/1:显示表式为1的联系人的信息。
Action_EDIT content://com.android.contacts/contacts/1:编辑标识为1的联系人的信息。
Action_Dial cotent://com.android.contacts/contacts/1:显示向标识为1的联系人拨号的界面
ACtion_View tel:123 :显示向指定号码123拨号的界面
Action_Dial tel:123:显示想指定号码123拨号的界面
一般来说,asserts目录下存放的资源代表应用无法直接访问的原生资源,应用程序需要通过assertsManager以二进制流的形式来读取资源,而res目录下的资源,安卓sdk会在编译该应用时,自动在R文件中为这些资源创建索引,程序可直接通过R资源清单类进行访问。
statelistdrawable用于组织多个drawable对象。当使用statlistDrawable作为目标组件的背景,前景图片时,statelistDrawable对象所显示的drawable对象会随目标组件状态的改变而自动切换。
定义statlistDrawable对象的xml文件的根元素为<selector../>
LayerDrawable资源
与statlistDrawable有点类似,LayerDrawable也可包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。
android:drawable:指定作为layerDrawable元素之一的Drawable对象
android:id :为该Drawable对象指定一个标识。
android:buttonmltoplleft|button:它们用于指定一个长度值,用于指定该Drawable对象绘制到目标组件的指定位置。
ShapeDrawable用于定义一个基本的几何图形,定义ShapeDrawable的xml文件的根元素是<shape../>元素
ClipDrawable资源
ClipDrawable代表从其他位图上截取的一个“图片片段”。在xml文件中定义clipDrawable对象使用<clip../>元素。
上面的语法个时钟可指定如下三个属性:
android:drawable:指定截取的源Drawable对象。
android:clipOrientation:指定截取方向,可设置水平截取或垂直截取。
android:gravity:指定截取时的对齐方式。
使用clipdrawable对象时可调用setlevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空,当level为10000时,截取整张图片。
使用原始xml资源
在某些时候,安卓应用有一些初始化的配置信息、应用相关的数据资源需要保存,一般推荐使用xml文件来保存它们,这种资源被称为原始xml资源。
原始xml资源一般保存在res/xml/路径下,当使用ADT创建安卓应用时,/res目录下并没有包含xml目录,开发者应该自行手动创建xml目录。
为了在java程序中获取实际的xml文档,可以通过如下resources的两个方法来获取。
XmlResourcesParser getXml(int id):获取xml文档,并使用一个XmlPullParser来解析该XML文档,该方法返回一个解析器对象(XmlResourceParser是XmlPullParser的子类)
InputStream openRawResources(int id):获取xml文档对应的输入流。
安卓默认使用内置的PULL解析器来解析Xml文件。
使用菜单(Menu)资源
菜单资源通常应该放在/res/menu目录下,菜单资源的根元素通常是<menu../>元素,<menu../>元素无须指定任何属性。<menu../>元素内可包含如下子元素
<item ../>元素,定义菜单项
<group../>子元素:将多个<item../>定义的菜单包装成一个菜单组。
checkableBehavior:指定该组菜单的选择行为。可指定为None,all和single三个值
menuCategory:对菜单进行分类,指定菜单的优先级。
Style 样式资源属性:
name:样式的名称。
parent:指定该样式所继承的父样式。当继承某个父样式时,该样式将会获得父样式中定义的全部格式。当然。当前样式也可以覆盖父样式中指定的格式。
主题资源
主题资源的xml文档同样以<resource../>元素作为根元素,同样使用<style../>元素来定义主题
主题和样式的区别主要体现在:
1、主题不能作用于单个View组件,主体应该对整个应用中的所有activity起作用,或对指定的activity起作用。
2、主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。