重新认识Android
首先我们来看下源码中源于Activity的定义:
- public class Activity extends ContextThemeWrapper
- implements LayoutInflater.Factory2,
- Window.Callback, KeyEvent.Callback,
- OnCreateContextMenuListener, ComponentCallbacks2 {
- ...
- }
下面我们来详细分析每一部分的具体意义:
extends ContextThemeWrapper表示Activity本质上是一个ContextThemeWrapper,而ContextThemeWrapper具体是什么呢?看ContextThemeWrapper在源码中的定义:
- public class ContextThemeWrapper extends ContextWrapper {
- ...
- }
可见ContextThemeWrapper是一个ContextWrapper,继续往下看:
- public class ContextWrapper extends Context {
- Context mBase;
- ...
- }
ContextWrapper本质上是一个Context,context 的定义如下:
- public abstract class Context {
- ...
- }
整体结构如下图所示(图引用自:http://blog.csdn.net/qinjuning/article/details/7310620):

Context是一个抽象类,因此可以知道Activity其实就是一个Context,并实现了一些接口,如何理解Context呢?
Context 俗称上下文,在很多对象定义中我们都用到了Context,例如ImageViewimageView = new ImageView(this); 这里的this就是当前Activity所在的Context,源码中对Context的解释如下:
Interface to global information about anapplication environment. This is an abstract class whose implementation isprovided by the Android system. It allows access to application-specificresources and classes, as well as up-calls for application-level operationssuch as launching activities, broadcasting and receiving intents, etc.
Context只是一个接口,真正实现Context功能的是ContexImpl类,为了了解Context具体有什么作用,我们先来了解下Context中定义了哪些接口:
- public abstract ComponentNamestartService(Intent service);
- public abstract boolean stopService(Intentservice);
- public abstract void startActivity(Intentintent);
- public abstract void sendBroadcast(Intentintent);
- public abstract Intent registerReceiver(BroadcastReceiverreceiver, IntentFilter filter);
- public abstract Resources getResources();
以上是Context众多接口中的一个片段,看着接口是不是很熟悉?其实我们经常用到的一些函数其实都是在Context中定义的,因此Context可以被认为是用来封装一下通用功能的一个类,当然这个类不仅仅是针对Activity,最常见的service也是继承自Context,以及一大堆类都继承自Context,具体可参考:http://developer.android.com/reference/android/content/Context.html,关于Context的具体介绍可参考:http://blog.csdn.net/qinjuning/article/details/7310620
ContextWrapper仅仅是对Context的简单封装,如果要对Context修改,我们只需要修改ContextWrapper,而不需要对通用的Context进行修改,ContextWrapper的目的仅此而已。而ContextThemeWrapper只是在ContextWrapper的基础上加入了Theme相关的一些内容,对于Activity来说需要处理一些Theme相关的东西,但是对于Service来说只需继承ContextWrapper,因为Service不需要处理Theme相关的内容。
分析完extends部分,我们再来看下implements部分,extends决定了Activity的本质,implements部分可以认为是对Activity的扩展。
- LayoutInflater.Factory:通过LayoutInflater来inflate一个layout时的回调接口
- Window.Callback: Activity 靠这个接口才有机会对消息进行处理,这部分涉及到消息的传递,以后将专门介绍。
- ComponentCallbacks2:定义了内存管理的接口,内存过低时的回调和处理处理接口
- KeyEvent.Callback:键盘事件响应的回调接口,例如onKeyDown()等
- OnCreateContextMenuListener:上下文菜单显示事件的监听接口,通过实现该方法来处理上下文菜单显示时的一些操作
通过以上分析,我们大概了解了Activity具体是什么了,这对以后理解Activity应该能带来一定的帮助。

Examples of android:scaleType attribute.
Top row (l-r) center, centerCrop,centerInside.
Bottom row (l-r): fitCenter, fitStart, fitEnd, fitXY.
- VuDroid (Based on MuPDF) Review on Open-App
- APV (based on MuPDF)
- PDF-Annotation (Based on APV, MuPDF) appears to be the only OS app with annotation abilities, and they're not confirmed to work.
- Android PDF Viewer (Based on Sun's pdf-renderer)
- eBookDroid (Based on VuDroid, MuPDF))
- DroidReader (Based on MuPDF)
- APDFViewer (Based on Poppler, xpdf)
- iPDF View (Based on APV, MuPDF)
- Perfect Viewer plugin
ActionBar

重新认识Android的更多相关文章
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Android Studio 多个编译环境配置 多渠道打包 APK输出配置
看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
随机推荐
- AngularJS之手动加载模块app和controller
使用ng的页面中一般都是使用模块自动加载,页面的结构一般是这样的 加载angularjs脚本 加载业务代码脚本(或者写在script标签中) html结构代码(带有ng指令) 就像这样 app.htm ...
- For xml path
Select * from tb for xml path('') 特点: 1. 以xml形式展示查询数据. 2. 自定义数据展示类型. 实例: 1. Select * from tb for xml ...
- 《JavaScript面向对象编程指南》译者序
相对于Perl.Python等动态脚本语言来说,JavaScript确实是一门饱受误解的语言.对于译者这种从20世纪90年代末走过来的C++程序员来说,尤其如此.在那个年代,提起JavaScript总 ...
- Yahoo Pure 中文参考手册
Pure 是来自雅虎的 CSS 框架,使用 Normalize.CSS 无需任何 JavaScript 代码.框架基于响应式设计,提供多种样式的组件,包括表格.表单.按钮.表.导航等.标识使用非常简单 ...
- MFC CPtrLink的使用
if (!m_SALink.IsEmpty()) { POSITION pos = m_SALink.GetHeadPosition(); for (int j = 0; j < m_SALin ...
- Faster-RCNN 训练自己的数据
在前一篇随笔中,数据制作成了VOC2007格式,可以用于Faster-RCNN的训练. 1.针对数据的修改 修改datasets\VOCdevkit2007\VOCcode\VOCinit.m,我只做 ...
- protobuf 数据解析的2种方法
方法1: message person{required int32 age = 1;required int32 userid = 2;optional string name = 3;} mess ...
- go语言的print
代码: package main import ( "fmt" ) type point struct { x, y int } func main() { //Go 为常规 Go ...
- python 模块openpyxl读excel文件
使用openpyxl模块来读取excel.要注意openpyxl读不再支持旧的xls格式. 先看一下操作前的excel是什么样子吧.对了,现在只支持xlsx格式的excel读取 我现在想在第三行插入3 ...
- Django常用命令及参数配置(Django 1.8.6)
常用命令 #新建Django项目 django-admin startproject mysite(项目名) #新建一个APP cd mysite python manager.py startapp ...