1. 程式人生 > >Android應用Context詳解及原始碼解析

Android應用Context詳解及原始碼解析

轉自 http://blog.csdn.net/yanbober/article/details/45967639 

1  背景

今天突然想起之前在上家公司(做TV與BOX盒子)時有好幾個人問過我關於Android的Context到底是啥的問題,所以就馬上要誕生這篇文 章。我們平時在開發App應用程式時一直都在使用Context(別說你沒用過,訪問當前應用的資源、啟動一個activity等都用到了 Context),但是很少有人關注過這玩意到底是啥,也很少有人知道getApplication與getApplicationContext方法有 啥區別,以及一個App到底有多少個Context等等的細節。

更為致命的是Context使用不當還會造成記憶體洩漏。所以說完全有必要拿出來單獨分析分析(基於Android 5.1.1 (API 22)原始碼分析)。

【工匠若水 http://blog.csdn.net/yanbober 轉載煩請註明出處,尊重分享成果】

2  Context基本資訊

2-1  Context概念

先看下原始碼Context類基本情況,如下:

1 2 3 4 5 6 7 8 9 10 /**   * Interface to global information about an application environment.  This is   * an abstract class whose implementation is provided by
  * the Android system.  It   * allows access to application-specific resources and classes, as well as   * up-calls for application-level operations such as launching activities,   * broadcasting and receiving intents, etc.   */ public abstract class Context {      ...... }

從原始碼註釋可以看見,Context提供了關於應用環境全域性資訊的介面。它是一個抽象類,它的執行被Android系統所提供。它允許獲取以應用為特徵的資源和型別,是一個統領一些資源(應用程式環境變數等)的上下文。

看見上面的Class OverView了嗎?翻譯就是說,它描述一個應用程式環境的資訊(即上下文);是一個抽象類,Android提供了該抽象類的具體實現類;通過它我們可 以獲取應用程式的資源和類(包括應用級別操作,如啟動Activity,發廣播,接受Intent等)。

既然上面Context是一個抽象類,那麼肯定有他的實現類咯,我們在Context的原始碼中通過IDE可以檢視到他的子類如下:

20150525145509450.png

嚇尿了,737個子類,經過粗略瀏覽這些子類名字和查閱資料發現,這些子類無非就下面一些主要的繼承關係。這737個類都是如下關係圖的直接或者間接子類而已。如下是主要的繼承關係:

20150525145251234.png

從這裡可以發現,Service和Application的類繼承類似,Activity繼承ContextThemeWrapper。這是因為Activity有主題(Activity提供UI顯示,所以需要主題),而Service是沒有介面的服務。

所以說,我們從這張主要關係圖入手來分析Context相關原始碼。

2-2  Context之間關係原始碼概述

有了上述通過IDE檢視的大致關係和圖譜之後我們在原始碼中來仔細看下這些繼承關係。

先來看下Context類原始碼註釋:

1 2 3 4 5 6 7 8 9 10 /**   * Interface to global information about an application environment.  This is   * an abstract class whose implementation is provided by   * the Android system.  It   * allows access to application-specific resources and classes, as well as   * up-calls for application-level operations such as launching activities,   * broadcasting and receiving intents, etc.   */ public abstract class Context {      ...... }

看見沒有,抽象類Context ,提供了一組通用的API。

再來看看Context的實現類ContextImpl原始碼註釋:

1 2 3 4

相關推薦

Android應用Context原始碼解析

轉自 http://blog.csdn.net/yanbober/article/details/45967639  1  背景 今天突然想起之前在上家公司(做TV與BOX盒子)時有好幾個人問過我關於Android的Context到底是啥的問題,所以就馬上

Android應用ViewDragHelper部分原始碼淺析

1 背景 很久沒有更新部落格了,忙裡偷閒產出一篇。寫這片文章主要是去年專案中的一個需求,當時三下五除二的將其實現了,但是原始碼的閱讀卻一直扔在那遲遲沒有時間理會,現在揀起來看看吧,否則心裡一直不踏實。 關於啥是ViewDragHelper,這裡不再

【MapReduce原始碼解析(一)】——分片輸入、MapperMap端Shuffle過程

title: 【MapReduce詳解及原始碼解析(一)】——分片輸入、Mapper及Map端Shuffle過程 date: 2018-12-03 21:12:42 tags: Hadoop categories: 大資料 toc: true 點選檢視我的部落格:Josonlee’

OKHttp使用原始碼解析

前言 上一篇部落格瞭解了Retrofit的使用,它是對OKHttp的封裝,且Retrofit2的內部實現是OKHttp3,下面就瞭解一下OKHttp3的使用! 使用 ①首先匯入依賴,最新的版本是3.4.1,在gradle中: compile 'com

SpringBoot之DispatcherServlet原始碼解析

在使用SpringBoot之後,我們表面上已經無法直接看到DispatcherServlet的使用了。本篇文章,帶大家從最初DispatcherServlet的使用開始到SpringBoot原始碼中DispatcherServlet的自動配置進行詳解。 DispatcherServlet簡介 Dispatch

Android應用開發Scroller原始碼淺析

1 背景 大家都知道Android View提供了scrollTo()與scrollBy()方法來供我們進行View的滾動,但是有個問題就是他的滾動很蛋疼,疼在是瞬時挪動到指定位置的,這種對於追求使用者體驗的今天來說簡直是硬傷啊;為了解決這個問題Google給

Android非同步訊息處理機制原始碼分析

PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 【工匠若水 http://blog.csdn.net/yanbober 轉載煩請註明出處,尊重分享成果】 最近相對來說比較閒,加上養病,所

Spring IOC容器啟動流程原始碼解析(一)——容器概念原始碼初探

目錄 1. 前言 1.1 IOC容器到底是什麼 IOC和AOP是Spring框架的核心功能,而IOC又是AOP實現的基礎,因而可以說IOC是整個Spring框架的基石。那麼什麼是IOC?IOC即控制反轉,通俗的說就是讓Spring框架來幫助我們完成物件的依賴管理和生命週期控制等等工作。從面向物件的角度來說,

Show, attend and tell演算法原始碼

mark一下,感謝作者分享! https://blog.csdn.net/shenxiaolu1984/article/details/51493673 原論文:https://arxiv.org/pdf/1502.03044v2.pdf 原始碼:https://github.c

Type的子介面原始碼解析

以下是原始碼中對Type的註釋:Type是Java中所有型別的常見的超介面,在程式語言中這些包括原始型別,引數化的型別,陣列型別,型別變數和原始型別。 Class在一定程度上挽救了擦除的型別資訊,我們就可以通過這幾個介面來獲取被擦除的型別引數資訊,這幾個介面無非就是對型別引數的一個

Android許可權系統管理

系統是執行在Linux核心上的,Android與Linux分別有自己的一套嚴格的安全及許可權機制, Android系統許可權相關的內容, (一)linux檔案系統上的許可權 -rwxr-x--x system   system       4156 2012-0

Struts2實現單檔案的上傳功能例項原始碼

  Struts2完成檔案的上傳功能例項 10級學員 郞志課堂筆記 在這裡通過一個例項簡單寫一下struts2實現檔案上傳的流程。 首先通過手寫的方式寫一個上傳的流程 第一步:建立相應的jsp頁面 <%@ page language="java" import="ja

AndroidContext ---- 你所不知道的Context

             前言:本文是我讀《Android核心剖析》第7章 後形成的讀書筆記 ,在此向欲瞭解Android框架的書籍推薦此書。         大家好,  今天給大家介紹下我們在應用開發中最熟悉而陌生的朋友-----Context類 ,說它熟

SparseArray原始碼簡析

一、前言 SparseArray 是 Android 在 Android SdK 為我們提供的一個基礎的資料結構,其功能類似於 HashMap。與 HashMap 不同的是它的 Key 只能是 int 值,不能是其他的型別。 二、程式碼分析 1. demo 及其簡析 首先也還是先通過 demo 來看一

ER圖例項解析

ER圖分為實體、屬性、關係三個核心部分。 實體是長方形,屬性是橢圓形,關係為菱形。 實體(entity): 即資料模型中的資料物件(即資料表),用長方體來表示,每個實體都有自己的實體成員(entity member)或者說實體物件(entity instance),例如

依賴注入框架 ----Dagger2 使用原始碼分析

在開始說Dagger之前先說下什麼叫依賴注入。 依賴: 在建立物件A的過程中,需要用到物件B的例項,這種情況較呼叫者A對被呼叫者B有一個依賴。 例如下面的例子: 組裝一臺電腦時,要用到Cpu,那麼電腦這個物件,依賴Cpu物件。 public cl

事件分發機制的原始碼分析

事件分發機制詳解 MotionEvent 主要分為以下幾個事件型別: ACTION_DOWN 手指開始觸控到螢幕的那一刻響應的是DOWN事件 ACTION_MOVE 接著手指在螢幕上移動響應的是MOVE事件 ACTION_UP 手指從螢幕上鬆開的那一刻響

SSH學習(十)Hibernate常用API原始碼分析

學習Java的同學注意了!!!  學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎掃描左欄的二維碼加入微信公眾號(codehzm)我們一起學java! 新接觸一個框架的目的就是想利用這個框架來為我們做一些工作,或者是讓他來簡化我們的工作,利用這個框架

Java IO:FileInputStream和FileOutputStream使用原始碼分析

1 使用方法   FileInputStream即檔案輸入流,使用它從檔案中獲得位元組流,FileOutputStream即問價輸出流,使用它將位元組流寫入檔案。 1.1 方法介紹   FileInputStream提供的API如下: FileI

Spring Boot啟動命令引數原始碼分析

使用過Spring Boot,我們都知道通過java -jar可以快速啟動Spring Boot專案。同時,也可以通過在執行jar -jar時傳遞引數來進行配置。本文帶大家系統的瞭解一下Spring Boot命令列引數相關的功能及相關原始碼分析。 命令列引數使用 啟動Spring Boot專案時,我們可以通過