学习笔记

来源:互联网 发布:磁盘格式化数据恢复 编辑:程序博客网 时间:2024/06/05 16:16

1.service启动

1)继承sevice类2)maniifiest中配置<service android:name=".MyService"/>3)开启服务:    a.Context.startService()    b.Context.bindService()   注意:    1.两者的区别在于,前者一旦开启了,与调用者无关,即使调用者退出了,它还是一直在   后台运行,后者反之.    2.若采用前者调用service的生命周期为:     onCreate-onStart(如果调用startService时,服务已经被创建,那么不会重复创建服务,只会多次调用onStart而已),只能通过StopService-onDestroy来停止服务     若采用后者调用service的生命周期为:     onCreate-OnBind(当调用者退出时,会调用onUnBind-onDestroy,同上,若是服务已经开启,不会重复创建服务,只会多次调用onbind).

2.广播 BroadcastRececiver

1)注册广播的方式两者方式:  a.静态注册,通过在mainifest.xml中配置  b.动态代码注册,通过registerRececiver方法注册。  区别:前者不是常驻广播,会跟随程序的生命周期,后者为常驻广播。2)播放的方式: 1)广义和顺序。3)广播解决跨进程通讯,调高效率,保证高内聚,低耦合。

3.handler,messager,messager queue,looper的关系(异步处理机制)
主要是为了解决多线程之间的并发问题。

1)handler:message的主要处理者,负责将message添加到消息队列以及对消息队列中的message进行管理2)message:消息,线程间的数据通讯单元,3)message queue:消息队列,用来存放通过handler发布的消息。先进先出原则。  每个messageQueue都会有对应的handlerhandler也会通过sendMassage()或者post方法来发送消息,消息会插入队列尾部,按照先进先出原则执行。   注:sendMassgae与post不一样,前者发送的是一个message对象,会被handler的handlerMessage执行,后者发送的是一个runnable,会自己执行。4)looper:循环器,handler与message queue之间的桥梁    Looper主要作用:    1、 与当前线程绑定,保证一个线程只会有一个Looper实例,同时一个Looper实例也只有一个MessageQueue。    2、 loop()方法,不断从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理。    好了,我们的异步消息处理线程已经有了消息队列(MessageQueue),也有了在无限循环体中取出消息的哥们,现在缺的就是发送消息的对象了,于是乎:Handler登场了。5)Looper主要是prepare()和loop()两个方法。 前者方法会对线程进行判断,若是线程存在则报错,否则new一个线程。因此确保这个方法只能调用一次,并且一个线程只有一个Looper loop()方法会对线程进行判断,若是为null,则报错。因此确保loop方法要在prtpare后面执行,然后进入循环,取出一则消息,若没有消息就阻塞。取出消息后,调用消息中target对象的dispatchMessage方法,最后释放消息占据资源。注:Looper是每条线程里的Message Queue的管家。Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper() 得到当前线程的Looper就有可能为NULL。对于子线程使用Looper,API Doc提供了正确的使用方法:这个Message机制的大概流程:    1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。    2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用 该Message的target指向的Hander的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:    1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;    2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;    3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。    由此可见,我们实现的handleMessage方法是优先级最低的!    3. Handler处理完该Message (update UI) 后,Looper则设置该Message为NULL,以便回收!    在网上有很多文章讲述主线程和其他子线程如何交互,传送信息,最终谁来执行处理信息之类的,个人理解是最简单的方法——判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行!    1.Handler对象的构造函数的参数为空,则为当前所在线程的Looper; 注:一个线程中只用一个looper,一个messager queue  但是可以有多个handler交互流程:handler(sendMessage())->MessageQueue( enqueueMessage()//将message加入队列-->next())->Looper(perpare()//创建Looper--->loop()->dispatchMessage()//分发给handler)->handler(handlerMassage())

4.android的系统框架:

从下往上为:linux内核层,运行库,应用框架层和应用程序层。linux内核:负责硬件的驱动程序,网络,电源,系统安全以及内存管理等功能。libraries和android runtime :大多数为开放的源代码函数库,即c/c++函数库部分。应用软件构架层:封装了的软件api,进行快速开发。应用软件层:桌面应用软件层。

5.ContentProvider实现数据共享。

0 0
原创粉丝点击