我对android系统学习的第一本书是《android移动应用基础教程》-铁路出版社;
对于android开发的基础知识有了一定的了解,能开发一些基本的安卓端应用,现在进行安卓进阶技术的学习,写此系列博客以督促自己,希望能提高学习效率,加强学习深度。
第一章 Android的构成基石---四大组件
1.1 Activity
actvity可以理解为一个用户界面,在应用中,当我们去写一个activity的时候,会先去加载指定的布局文件,获取相关的UI元素并设置事件处理函数,使得用户可以与这些UI进行交互。除此之外还需要处理一些activity之间的跳转,数据传输,从而完成特定的操作流程;较为浅显地理解activity就是一个特定的类,其继承于Activity抽象类,必须实现onCreate方法;而对于一整个activity来说,有其所处的生命周期的不同阶段,在不同阶段会回调不同的生命周期函数,onCreate()函数就是在activity第一次被创建时调用的,通常会在这函数里面完成activity的初始化操作。activity的生命周期网上讲述的很多,实际操作中也经常会用到相关函数,在此不多做叙述。
activity的构成不仅仅是一个布局文件,视图会被设置给Window类,Window中还有一个DecorView,此为整个窗口的顶级视图,开发人员设置的布局会被设置到此DecorView的mContentParent中。即android中内置了一些系统布局xml,这也就解释了为啥总有个那么丑的标题栏摆着。
activity有四种启动模式,简述如下:
①standard:标准启动模式+默认启动模式,任务栈中可以存在多个activity实例;
②singleTop:可以理解为栈顶唯一启动模式,如果此activity在栈顶,也就是当前显示,则再启动activity的时候不会创建新的实例,调用onNewIntent()函数,而除此之外,仍然会创建一个新的实例;
③singleTask:一个任务栈中只能有一个该activity,if(activity 不在栈中){创建新的实例;}else{销毁所有处在该activity上的activity,最终让activity实例处于栈顶,回调onNewIntent();}
④singleInstance:在一个独立的任务中开启activity,且次任务中只存在一个实例,再次启动activity的时候,会重用已存在的任务和实例。
1.2 Service
Service不依赖于用户界面,实现了程序的后台运行,而需要注意,其仍然执行在UI线程中,所以不要在Service中直接进行耗时操作;Service分为start和bind两种启动方法,这两种方法很好理解区分,如果你需要启动一个不需要数据交互,方法调用的服务,使用start就是很单纯的开启一个服务即可,而如果需要进行一些相互调用之类的事情,则使用bind方法,不要老去理解什么绑定不绑定,这两个都是开启服务的方法,知道这个就行了。
start方法简单,调用Context的startService()函数,相应服务就启动了,知道你stop它位置,Service可以stopself也可以被stop;这既然是四大组件之一,那我们再简单的理解这就是个JAVA类,继承了Service,需要在Mainfest中进行注册;
bindService也很好理解,在我们写的Service中有一个必须写的函数加onBind(),这个函数返回一个IBinder对象,这理解为一个通信员就行,在bindService开启服务的时候需要传入一个ServiceConnection,在bind之后会回调onServiceConnected()函数表示绑定成功,这是onBind()返回的IBinder对象就被返回到activity中,通过这个对象就可以去进行服务中的方法调用,可以理解为通过这个进行服务的私用化。
AIDL更简单,就是IBinder变成Stub,Stub是啥,,自己了解一下AIDL是啥就好,写给自己看的东西不废那么多话。
1.3 Broadcast
广播是一种在应用程序之间传输信息的机制,一个广播可以有任意个接受者,属于发布---订阅的模式,也就是观察者模式,其最大特点在于发送方不关心接收方是否收到数据,也不关心接收方如何处理数据,通过这样的形式达到接收双方的完全解耦合。广播机制三要素:发送广播的Broadcast,接受广播的BroadcastReciver以及用于传递信息的Intent。广播可分为普通广播,有序广播和Sticky广播。
在21版的Support v4包中新增本地广播,LocalBroadcastManager,有时候我们不需要把自己应用内的信息广播给所有应用,而只是进程内使用,本地广播就可以实现这一的效果。
Sticky广播会一直滞留,当有匹配此广播的广播接收器被注册之后,该广播接收器就会收到此条广播。
1.4 ContentProvider
外共享数据,最简单的用法,通过contentresolver和uri查询获取相册中的图片,uri就理解为一个地址,可以详细到某一条具体的数据,也可以是一个很广的范围,我们通过uri查询,返回一个数据集合,就像数据库的操作一样。还有很多细的可以讲,但最好还是在实际码代码中操作会比较好。