文 | 莫若吻
注:
1.本文内容参考 李刚的《疯狂Android讲义》一书。
2.此书适合有一定Java基础、初学Android的同学阅读与学习。我最近想巩固下Android基础知识就来拜读一下此书。
3.本文笔记侧重于知识梳理,不侧重于讲解,如果有同学遇到不懂的知识点可以给我留言或者买书自行学习。
4.如果你最近想参加面试,可以参考此文复习哦!
一.第一章 Android应用
1.Android平台架构及特性
Android系统的底层建立在Linux系统之上,Android平台由操作系统、中间件、用户界面和应用软件四层组成,采用一种被称为软件叠层(Software Stack)的方式进行构建。
这种软件叠层结构使层与层之间相互分离,明确各层的分工。这种分工保证了层与层之间的低耦合。当下层的层内或层下发生改变时,上层应用程序无须任何改变。
2.Android系统组成
Android系统主要由应用程序层、应用程序框架、函数库、Android运行时及Linux内核等5部分组成。
1)开发Android应用程序(即Android APP)是面向底层的应用程序框架进行的。
2)Android运行时由Android核心库集和**Dalvik虚拟机**2部分组成。每一个Android应用程序都运行在一个单独的Dalvik虚拟机内。
3)Dalvik虚拟机依赖于Linux内核提供的核心功能。
4)Linux内核提供了安全性、内存管理、进程管理、网路协议栈和驱动模型等核心系统服务。
3.Dalvik虚拟机与JVM的区别
- Dalvik虚拟机并不遵守JVM(Java Virtual Machine)的规范,两者并不兼容。
- JVM运行的是Java字节码(一般是.class文件);
Dalvik运行的是专有的dex文件(Dalvik Executable)。 - JVM直接从.class文件或JAR包中加载字节码后运行;
Dalvik则需要通过DX工具将应用程序的所有. class文件译成.dex文件,Dalvik则运行.dex文件。 - Dalvik虚拟机非常适合在移动端上使用;相对于PC或服务器上运行的虚拟机,Dalvik不需要很快的CPU计算速度和大量的内存空间。
- JVM都是基于栈的,而Dalvik则是基于寄存器的。
4.Dalvik虚拟机的特点
- 运行专有的.dex文件。
专有的.dex文件减少了.class文件中的冗余信息,而且会将所有的.class文件整合到一个文件中,从而提高运行性能,而且DX工具还会对.dex文件进行一些性能优化。 - 基于寄存器实现。
大部分虚拟机包括JVM都是基于栈的,而Dalvik则是基于寄存器的。一般基于寄存器的虚拟机具有更好的表现,但在硬件通用性上略差。
5.AndroidManifest.xml清单文件
包括信息:
- 应用程序的包名,该包名将作为应用的唯一标识。
- 应用程序所包含的组件,eg:Activity、Service、BroadcastReceiver、ContentProvider等。
- 应用程序兼容的最低版本。
- 应用程序使用系统所需的权限声明。
- 其他程序访问该程序所需的权限声明。
eg:
<?xml version="1.0" encoding="utf-8"?>
<!--指定Android应用包名:package -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.promise.sun">
<!--应用权限声明 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!--指定Android应用的标签和图标:label、icon -->
<application
android:name=".SunApplication"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="${APP_NAME}"
android:theme="@style/AppTheme"
android:largeHeap="true"
tools:replace="android:allowBackup,android:label,android:theme">
<!--定义Android的一个组件:activity -->
<activity
android:name=".app.activity.WelcomeActivity"
android:screenOrientation="portrait"
android:theme="@style/StartAppTheme">
<intent-filter>
<!--指定此activity为应用程序入口 -->
<action android:name="android.intent.action.MAIN" />
<!--加载该应用程序时运行此activity -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--定义Android的一个组件:service -->
<service android:name=".app.ApkUpdateService" />
</application>
</manifest>
6.Android组件简介
1)Activity和View
Activity是Android的四大组件之一。
Activity是Android中负责与用户交互的组件,只能通过setContentView(view);来显示指定组件。
View组件是所有UI控件、容器控件的基类,但view组件需要放到容器组件中或者使用Activity将其显示出来。
Note:ViewGroup是View的子类。
2)Service
Service是Android的四大组件之一。拥有独立的生命周期。
Service作用:一般用于为其他组件提供后台服务和监控其他组件的运行状态。
Service与Avtivity的区别在于:Service通常位于后台运行,一般不需与用户交互,因此Service没有图形用户界面。
3)BroadcastReceiver
BroadcastReceiver是Android的四大组件之一。广播消息接收器,对Android应用中其他组件进行监听。
注册系统级的监听事件有两种方式:
- 在Java 代码中通过Context.registReceiver();完成注册广播。
- 在清单文件中使用
4)ContentProvider
ContentProvider是Android的四大组件之一。
ContentProvider为Android应用之间实现实时数据交换。
Note:一般与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResolver来访问数据。
5)Intent和IntentFilter
严格讲 Intent并不是Android应用组件。它是Android应用内不同组件之间通信的载体。
Note:Activity、Service、BroadcastReceiver三种组件之间的通信都以Intent作为载体,只使用时略有区别。
- 启动一个Activity,使用Context的startActivity(intent);方法。
- 启动一个Service,使用 startService(intent); 或者 bindService(intent,serviceConnection,intFlags);方法。
- 触发一个BroadcastReceiver,使用sendBroadcast(intent); 或者sendStickyBroadcast(intent) 或者;sendOrderedBroadcast(intent,receiverPermission);方法发送广播。
显示Intent和隐式Intent:
显示Intent:明确指定需要启动或者触发的组件的类名。
隐式Intent:只是指定需要启动或者触发的组件应该满足的条件。
Note:隐式Intent需要通过IntentFilter实现,被调用组件使用IntentFilter来声明自身所满足的条件。