<疯狂Android讲义>阅读笔记(3)

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、主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值