系统的学习(比如看教学视频或从头到尾读一本安卓开发的书)几乎不太可能了,确实在时间方面不允许,只能是用到什么就必应搜索什么现学现卖了。这两天有点时间专攻了一下一些概念性方面的东西。

思维已经固化了,很多概念总是想与windows上的进行对比,也许这样很好、把那些android特有的部分学习好基本也就掌握了。下面要汇报一下小编对这些概念的理解情况了,首先遇到的是Activity.

一.Activity是什么?

这个东西与windows上的窗口中对应,Activity是界面(屏幕)管理类,在Android 程序框架内一个应用的界面就是(也只能是)由一个Activity去创建、构造和响应。

Activity管理整个屏幕,而窗口只负责自己的显示,所以区别还是很大的。Activity活动时占着整个屏幕,所以也叫“活动”。

  • 为了构造一个界面它需要一个xml布局文件,这是个资源文件
  • 为了响应用户的操作它还需要建立一个消息响应机制,其实这个消息处理机制并不属于Activity,在Activity被OnCreate之前,主线程会被建立,其实主线程才是消息的推动源。

 

二.Android程序的编译过程

本质上这与windows应用程序的编译过程原理是一致的,可执行文件内存储着两类数据,一是资源(也就是展示、配置用的数据),另一个是执行代码。

执行代码是从你的.java文件编译过来的,而xml布局文件、图片,字符串等这些资源文件通过一个资源打包工具(aapt)编译到apk中,当代码得到执行后会从可执行文件自身体内提取资源进行展示。

为了执行代码能准确的找到不同的资源,资源打包工具为每个资源进行了编号,编号后生成了R.java文件,所以你的java程序要用到资源那就必须与R.java同时进行编译器,当然R.java是自动生成的,无需改动。

 

三.进程,线程

按道理不应该这么快就讨论这个话题,但我目前想做的一个事情是通过手机实现电脑的关机,要用到UDP通信,发现要用网络通信线程的必不可少的,好吧,开始啃这个骨头。

  • 进程代表了整个应用程序,操作系统进行任务调度时会考虑一些进程的因素,但进程并非是CPU占用的最小主体。进程包括多个线程,这些线程在操作系统中有一个共同的标签那就是进程。

对于程序员来说,进程代表着内存统一编址,即在一个进程内A线程把一个变量地址发线B线程后B线程可准确无误的操作这个变量。这在进程和进程之间就行不通了。

  • 线程

线程分UI线程和工作者线程,这一点与windows是雷同的,那么什么是UI线程呢?在我们用android studio创建一个项目显示第一个avtivity时系统默认创建的线程就是UI线程,也叫主线程。

UI线程是消息驱动的,只有发送消息他才动一下,否则就一直在那里冒着。从代码层面这个非常好理解,UI线程的运行函数最后调用looper.loop()。looper就是个消息处理类, 其成员函数loop就是告诉系统CPU还给你了有消息通知我。

工作者线程就是我们用Thread类创建的线程,其特点就是Run函数内是一个死循环,某一时刻在等待什么都是由用户代码决定。我们可以将一个工作者线程配合looper、Handler两个对象将其变成一个UI线程,貌似handlerThread类就是干这个事情。

在安卓UI线程和工作者线程有两个非常重要的特点:

(1)不能阻塞UI线程,比如工作者线程中你发个网络消息那是不允许的。

(2)不能在UI线程之外调用Android的UI组件包,比如在工作者线程中显示个字符串

这两个特点让UI线程和工作者线程之间的同步和数据交换变得棘手迫切。按道理同步应当使用操作系统提供的信号量、互斥量等对象来实现,但实际上在安卓除了消息机制我还没有找到更合适的线程同步方法(什么文件啊、数据库啊、网络什么的都不算)。

 

四.消息

在windows消息针对的是窗口,消息 发给谁?发给窗口,而在android消息针对的是一个handler对象,发给谁?就发给这个handler对象。windows中也有handler但这个handler只是内核对象的一个编号而已,也叫句柄。内核会根据这个句柄可以找到对应的对象。

在安卓上建立消息接收机制用到looper类、handler类。那么我现在要猜测activity的消息管理原理了:

首先activity应该继承自handler类,然后有一个looper对象成员,当主线程初始化activity时绑定looper和activity,最后调用looper.loop(),由于activity重写了handler的OnRecver函数,自然也就能处理并接收消息 了。

关于消息本身Message类似乎没什么可说的,就是个looper要求的数据结构、数据的载体或容器,应该就是。

 

今天就写到这里了,继续研究我的UDP手机关PC程序。