• 在安装android应用程序时,android会为每一个应用程序分配一个linux用户id,除非应用间在manifest.xml中定义了相同的android:sharedUserId属性,其它应用不能访问此应用的数据和资源。

    拥有相同linux id的应用可以运行在同一个进程内,共享同一个java虚拟机

  • 单线程模型原则:android UI操作不是线程安全的,并且这些操作必须在UI线程中执行
  • UI线程超过5s没有相应用户请求,会弹出对话框提醒用户终止应用。耗时操作需要新开线程,采用Message Quenue机制保证线程间的通信

    Handler可与UI线程通信,Handler把消息传递给Looper,Looper再把消息传递放入队列,Looper也把消息队列里的消息广播给所有Handler,Handler接收到消息后调用handleMessage方法处理

    • 1.使用sendMessage():通过Handler将消息发送给消息队列
    • 2.在发送消息的时候,使用message.target=this为handler发送的message贴上当前handler的标签
    • 3.开启HandlerThread线程,执行run方法。
    • 4.在HandlerThread类的run方法中开启轮询器进行轮询:调用Looper.loop()方法进行轮询消息队列的消息
    • 5.在消息队列MessageQueue中enqueueMessage(Message msg, long when)方法里,对消息进行入列,即依据传入的时间进行消息入列(排队)
    • 6.轮询消息:与此同时,Looper在不断的轮询消息队列
    • 7.在Looper.loop()方法中,获取到MessageQueue对象后,从中取出消息(Message msg = queue.next()),如果没有消息会堵塞
    • 8.分发消息:从消息队列中取出消息后,调用msg.target.dispatchMessage(msg);进行分发消息
    • 9.将处理好的消息分发给指定的handler处理,即调用了handler的dispatchMessage(msg)方法进行分发消息。
    • 10.在创建handler时,复写的handleMessage方法中进行消息的处理
    • 11.回收消息:在消息使用完毕后,在Looper.loop()方法中调用msg.recycle(),将消息进行回收,即将消息的所有字段恢复为初始状态。
  • AsyncTask用于解决handler自己管理线程类的麻烦(TODO:有bug,待补充)

    onPreExecute() 执行后台操作前由UI线程调用
    doInBackgroud() 在后台线程中处理耗时操作
    onPostExcute() 后台操作执行完毕后在UI线程中调用

android IPC(进程间通信) 机制Binder

  • Linux通信机制:管道(Pipe)、信号(Signal)、跟踪(Trace)--只能用于父子或兄弟进程间通信。后又增加了Named Pipe

  • 在Android的Binder机制中,由Client、Server、Service Manager和Binder驱动程序组成,前三者运行在用户空间,Binder驱动程序运行在内核空间。Binder机制无论从系统开发还是应用开发的角度看,都是android中最重要的组成部分。

    • Binder驱动程序和Service Manager在Android平台已经实现,开发者只需在用户空间实现Client和Server
    • Binder驱动程序提供设备文件/dev/binder与用户空间交互,可通过文件操作函数open()和ioctl()与Binder驱动程序通信
    • Service Manager是一个守护进程,用来管理服务器端,并向客户端提供查询服务器端接口的能力(Binder机制的上下文管理者)

学习中