学习笔记

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值