Android系统分析及应用编程(一)

Android系统分析及应用编程(一)

Android应用开发有一段时间了,做系统层面的却还是属于新手,一直想写点自己的东西,也不知道我定的这个系列的文章能坚持写到什么时候?总之既然决定了就一直写下去吧。

Android系统架构

自上而下分为:应用程序层(Application)咱们做应用的小伙伴就一直在这个层面工作、应用程序框架层(FrameWork)这个层里面我们会定义出供应用层调用的接口及一些与底层相关的JNI(Java Native Interface)为什么会有这样一种特殊的接口存在呢?看过Android系统源码的小伙伴都知道Android底层驱动的实现是通过C/C++代码实现的。而我们顶层的代码是Java,如何才能用Java调用到C/C++,这里就用到了JNI它是连接顶层与底层的桥梁、Android运行环境(Run Time)及库文件,这些库文件的作用是什么,它其实就是些功能库例如:图形界面、浏览器等等、Android 系统层(OS)这一层主要就是些驱动:显示驱动、键盘驱动、SIM卡驱动、内存驱动、电池驱动、USB 驱动、照相机驱动、Binder IPC驱动等等。

Android五大基本组件详解

  • Activity
    Activity 是我们最常见的组件了,在应用程序中一般一个Activity就是一个单独的屏幕。每一个活动都被实现为一个独立的类,而我们操作页面的类都要继承Activity,Activity将会提供给开发者一些操作UI的接口,而且还为开发者提供了这些UI的回调接口。众所周知,通常情况下一个APP会有几个或者更多的页面的组成,因此设计到了不同Activity之间的一些相互协调的行为,要想很好的协调好这些Activity之间的工作,对于Activity的生命周期就要非常的熟悉才行,如图1.1所示:
    图1.1
    这里引用这篇博主的关于生命周期的总结,写的非常详细我在这里就不再啰嗦了,这里还需要有几点知识的拓展:

    Activity的启动模式

    启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;这里也就有了Android的启动栈,什么是栈呢?它好比就是一个容器,根据不同的需要这个容器的出栈顺序也是不一样的有先入先出(FIFO)、后入显出(LIFO)两种。那好咱们说明下上面所说的四种模式:
    1、standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
    2、singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
    3、singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
    4、singleInstance:如果应用A的任务栈中创建了MainActivity实例,如果应用B也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

    Bundle savedInstanceState

    看到这个参数大家不陌生吧?没错大家看下这个基本代码段:

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
        }
    
    }
    

    具体怎么解释大家可以参考这位博主的帖子

  • Intent
    Android 通过intent类实现了与各个Activity之间的交互及页面切换。Intent意味Android的意图它描述了其根本的目的是什么。通过Intent我们既可以实现页面的切换还可以实现数据的传递。Intent的另外一个子类Intent Filter则是用来指定“我能做什么”,通常我们会在AndroidMainfest.xml去描述它。通过intent实现Activity的切换利用startActivity()方法去启动,这样Android系统就会遍历所有的应用程序的intent filter的 action ,并找到与其匹配的activity,因而这个Activity会接受Intent的消息,这样Activity仅仅只需要发送一个Intent 便可以重用其他的组件功能。
    附:不错的intent讲解博文

  • Service
    Service首先其不具备UI页面但是却可以常驻Android系统的组件,Acitvity可以通过context.startService()启动一个Service。通过context.bindService()方法连接到一个Service上,这里从新绑定Service若未启动则会重新启动,反之则直接启动。这里因此也就出现了两对方法:.startService()和stopService()、bindService()和unbindService()方法,通常情况下service 在启动后即使startService()的进程析构了,但是其仍然存在,直到我们调用stopService()和stopSelf()为止,这里我说的是通常情况下,那就还有特殊情况下,大家都听说过“不死的service”,有种情况下service也会被回收的,当系统内存被占用过高的情况下,通常Androuid 会将一些优先级别低的和一些启动进程被回收的service给回收掉,所以也就出现如何实现“不死的service”。这里我也不过多讲述,大家可以等待以后这个系列我会在系统和应用两个层面两种技术手段去实现。

  • Receiver
    按照套路解释名词,根据api 文档解释如下:
    1、广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
    2、应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。
    3、广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
    其流程如下:
    1、注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。
    2、发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
    3、接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时dialog。
  • Content Provider
    这个是android一种存储机制,这里大家回忆下Android有几种存储模式,是的5种分别是:SharedPreferences、文件(I/O)存储数据、SQLite存储数据、ContentProvider存储数据、网络存储数据(这个容易被忽视)。是的Content Provider作为五种存储方式之一其意义在于它有一套完整的接口在存储和获取数据方面。适用背景:当应用将数据存储到SQLite里面,或者存放到了其他设备中,若想让其他的应用程序使用程序中的数据时,其就用到了Content Provider。关于其接口函数,现在简单的列举下:
    1、query:查询
    2、insert:插入
    3、update:更新
    4、delete:删除
    5、getType:得到数据类型
    6、 onCreate:创建数据时调用的回调函数
Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android模拟器 1.4 下载、编译和运行Android内核源代码 1.4.1 下载Android内核源代码 1.4.2 编译Android内核源代码 1.4.3 运行Android模拟器 1.5 开发第一个Android应用程序 1.6 单独编译和打包Android应用程序模块 1.6.1 导入单独编译模块的mmm命令 1.6.2 单独编译Android应用程序模块 1.6.3 重新打包Android系统镜像文件 第2章 硬件抽象层 2.1 开发Android硬件驱动程序 2.1.1 实现内核驱动程序模块 2.1.2 修改内核Kconfig文件 2.1.3 修改内核Makefile文件 2.1.4 编译内核驱动程序模块 2.1.5 验证内核驱动程序模块 2.2 开发C可执行程序验证Android硬件驱动程序 2.3 开发Android硬件抽象层模块 2.3.1 硬件抽象层模块编写规范 2.3.2 编写硬件抽象层模块接口 2.3.3 硬件抽象层模块的加载过程 2.3.4 处理硬件设备访问权限问题 2.4 开发Android硬件访问服务 2.4.1 定义硬件访问服务接口 2.4.2 实现硬件访问服务 2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 3.2.1 强指针的实现原理分析 3.2.2 弱指针的实现原理分析 3.2.3 应用实例分析 第2篇 Android专用驱动系统 第4章 Logger日志系统 4.1 Logger日志格式 4.2 Logger日志驱动程序 4.2.1 基础数据结构 4.2.2 日志设备的初始化过程 4.2.3 日志设备文件的打开过程 4.2.4 日志记录的读取过程 4.2.5 日志记录的写入过程 4.3 运行时库层日志库 4.4 C/C++日志写入接口 4.5 Java日志写入接口 4.6 Logcat工具分析 4.6.1 相关数据结构 4.6.2 初始化过程 4.6.3 日志记录的读取过程 4.6.4 日志记录的输出过程 第5章 Binder进程间通信系统 5.1 Binder驱动程序 5.1.1 基础数据结构 5.1.2 Binder设备的初始化过程 5.1.3 Binder设备文件的打开过程 5.1.4 Binder设备文件的内存映射过程 5.1.5 内核缓冲区管理 5.2 Binder进程间通信库 5.3 Binder进程间通信应用实例 5.4 Binder对象引用计数技术 5.4.1 Binder本地对象的生命周期 5.4.2 Binder实体对象的生命周期 5.4.3 Binder引用对象的生命周期 5.4.4 Binder代理对象的生命周期 5.5 Binder对象死亡通知机制 5.5.1 注册死亡接收通知 5.5.2 发送死亡接收通知 5.5.3 注销死亡接收通知 5.6 Service Manager的启动过程 5.6.1 打开和映射Binder设备文件 5.6.2 注册为Binder上下文管理者 5.6.3 循环等待Client进程请求 5.7 Service Manager代理对象的获取过程 5.8 Service组件的启动过程 5.8.1 注册Service组件 5.8.2 启动Binder线程池 5.9 Service代理对象的获取过程 5.10 Binder进程间通信机制的Java接口 5.10.1 Service Manager的Java代理对象的获取过程 5.10.2 Java服务接口的定义和解析 5.10.3 Java服务的启动过程 5.10.4 Java服务代理对象的获取过程 5.10.5 Java服务的调用过程 第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 匿名共享内存块的锁定和解锁过程 6.1.6 匿名共享内存块的回收过程 6.2 运行时库cutils的匿名共享内存访问接口 6.3 匿名共享内存的C++访问接口 6.3.1 MemoryHeapBase 6.3.2 MemoryBase 6.3.3 应用实例 6.4 匿名共享内存的Java访问接口 6.4.1 MemoryFile 6.4.2 应用实例 6.5 匿名共享内存的共享原理 第3篇 Android应用程序框架 第7章 Activity组件的启动过程 7.1 Activity组件应用实例 7.2 根Activity组件的启动过程 7.3 子Activity组件在进程内的启动过程 7.4 子Activity组件在新进程中的启动过程 第8章 Service组件的启动过程 8.1 Service组件应用实例 8.2 Service组件在新进程中的启动过程 8.3 Service组件在进程内的绑定过程 第9章 Android系统广播机制 9.1 广播机制应用实例 9.2 广播接收者的注册过程 9.3 广播的发送过程 第10章 Content Provider组件的实现原理 10.1 Content Provider组件应用实例 10.1.1 ArticlesProvider 10.1.2 Article 10.2 Content Provider组件的启动过程 10.3 Content Provider组件的数据共享原理 10.3.1 数据共享模型 10.3.2 数据传输过程 10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 System进程的启动过程 第12章 Android应用程序进程的启动过程 12.1 应用程序进程的创建过程 12.2 Binder线程池的启动过程 12.3 消息循环的创建过程 第13章 Android应用程序的消息处理机制 13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1 创建InputManager 14.2.2 启动InputManager 14.2.3 启动InputDispatcher 14.2.4 启动InputReader 14.3 InputChannel的注册过程 14.3.1 创建InputChannel 14.3.2 注册Server端InputChannel 14.3.3 注册系统当前激活的应用程序窗口 14.3.4 注册Client端InputChannel 14.4 键盘消息的分发过程 14.4.1 InputReader获得键盘事件 14.4.2 InputDispatcher分发键盘事件 14.4.3 系统当前激活的应用程序窗口获得键盘消息 14.4.4 InputDispatcher获得键盘事件处理完成通知 14.5 InputChannel的注销过程 14.5.1 销毁应用程序窗口 14.5.2 注销Client端InputChannel 14.5.3 注销Server端InputChannel 第15章 Android应用程序线程的消息循环模型 15.1 应用程序主线程消息循环模型 15.2 与界面无关的应用程序子线程消息循环模型 15.3 与界面相关的应用程序子线程消息循环模型 第16章 Android应用程序的安装和显示过程 16.1 应用程序的安装过程 16.2 应用程序的显示过程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值