这篇是《疯狂Android讲义》第二篇学习笔记,有很多东西实在是不方便记录到博客中,或者是有一些知识点我已经掌握了,就未记录。如果有同学想入门Android,那么还是需要找一本书来仔细看看,并且敲一敲代码。附上《疯狂Android讲义》代码demo:https://github.com/weimuhua/TestLibProject。
1.StateListDrawable资源
StateListDrawable资源用于组织多个Drawable资源,当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随着目标组件状态的改变而自动切换。定义StateListDrawable对象的XML文件的根元素为<selector…/>,该元素可以包含多个<item…/>元素,该元素可以指定如下属性。(1)android:color或drawable:指定颜色或者Drawable对象。(2)android:state_xxx:指定一个特定的状态。xxx可以是系统定义的状态,如state_selected或state_selected,也可以是声明在attrs.xml的自定义的状态。如下:
<declare-styleable name="CalendarPickerView">
<attr name="android:background" />
<attr name="tsquare_dividerColor" format="color" />
<attr name="tsquare_dayBackground" format="reference" />
<attr name="tsquare_displayHeader" format="boolean" />
<attr name="tsquare_headerTextColor" format="color" />
</declare-styleable>
2.LayerDrawable资源
LayerDrawable也可以包含一个Drawable数组,系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。定义LayerDrawable对象的XML文件的根元素为<layer-list…/>,该元素可以包含多个<item…/>元素,该元素可指定如下属性:(1)android:drawable:指定作为LayerDrawable元素之一的Drawable对象。(2)android:id:为该Drawable对象指定一个标识。(3)android:bottom|top|left:用于指定一个长度值。
3.ShapreDrawable资源
ShapreDrawable用于定义一个基本的几何图形,定义ShapreDrawable的XML文件的根元素是<shapre…/>元素,该元素可指定如下属性:(1)android:shapre=[“rectangle”|”oval”|”line”|”ring”]。圆角Button实例。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 填充的颜色 -->
<solid android:color="@color/common_blue" />
<!-- android:radius 弧形的半径 -->
<corners android:radius="@dimen/common_roundbtn_corner_radius" />
</shape>
4.ClipDrawable
ClipDrawable代表从其他位图上截取一个图片片段。使用ClipDrawable对象可调用setLevel()方法来设置街区的区域大小。当level为0的时候,截图的片段为空,当level为10000时,截取整张图片。
5.ContentProvider
ContentProvider这个概念在我初学的时候,确实是一个不太好理解的概念。不过随着我接触Android时间越来越长,发现ContentProvider其实并没有那么难于理解。ContentProvider用于在不同的应用或者同一个应用不同的进程中分享数据的。ContentProvider以某种Uri的形式对外提供数据,允许其他应用或本应用跨进程调用。其他应用或本应用其他进程通过ContentResover通过Uri去操作指定的数据。
开发步骤:(1)定义一个类,继承自ContentProvider。(2)在AndroidManifest文件中注册此ContentProvider,并指定android:authorities元素。(3)对外暴露增删改查这几个操作数据的方法。
6.Service
对于Service这种复杂的组件,我主要记录对于我个人有帮助的知识点,大家如果想详细了解的话还是应该买本书或者参照官方教程仔细阅读。
Service有两种启动方式:(1)startService方法,client退出了Service仍在。(2)bindService方法,client退出了Service也就终止了。
IntentService会使用队列来管理请求Intent,每当client通过Intent请求启动IntentService时,IntentService会将该Intent假如队列中,然后开启一个新的worker线程来处理。保证同一时刻只会处理一个Intent,并且不会阻塞主线程。IntentService的onStartCommand方法默认会将请求Intent添加到队列中,只需要重写onHandleIntent()方法即可。
看了一下源码,其实IntentService的原理也很简单,它就是在启动之后启动了一个HandlerThread然后在此线程里进行工作。在它的onStart()方法中,通过handler将msg发送至worker线程,然后在handler的handleMessage中方法回调onHandleIntent()方法,因此在继承IntentService的子类中需要重写onHandleIntent()方法。
7.Broadcast
Broadcast分为两种,normal Broadcast和ordered Broadcast。(1)normal Broadcast是完全异步的,几乎在同一时间让所有的接受者接收到广播。但接受者无法将处理结果传递给下个接受者,无法终止广播的传播。(2)ordered Broadcast的接收者按照预先声明的优先级依次接收Broadcast。优先级可以声明在清单文件的<intent-filter…/>中,也可以通过IntentFilter的setPriority()方法设置。优先接收到广播的receiver可以调用abortBroadcast()方法终止Broadcast。还可以通过setResultExtra(Bundle)将结果存入Broadcast中,传递给下一个接收者。