1. 程式人生 > >Android各種獲取Context方法

Android各種獲取Context方法

首先講一講這四個函式的區別,後面還有我對context的一些理解

區別如下所示:

翻譯+我的總結如下

1. getApplicationContext() :

這個函式返回的這個Application的上下文,所以是與app掛鉤的,所以在整個生命週期裡面都是不變的,這個好理解,但是使用的時候要注意,該context是和引用的生命週期一致的,所以和activity生命週期掛鉤的任務不要使用該context,比如網路訪問,防止記憶體洩露

2. getBasecontext():

stackoverflow上面寫的是,這個函式不應該被使用,用Context代替,而Context是與activity相關連,所以當activity死亡後可能會被destroyed,我舉個我自己寫的例子

public Dialog displayDialog(int choice) {  switch(choice){  case 0   AlertDialog aDialog = new AlertDialog.Builder(this   .setIcon(R.drawable.ic_launcher)    .setTitle("Hello World"   .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
@Override  public void onClick(DialogInterface arg0, int arg1) {          Toast.makeText(getBaseContext(), "OK clicked", Toast.LENGTH_SHORT).show();        }      });   } }

這個例子中的getBaseContext()就不能被this代替,因為上面的this返回的是這個activity的context,而在這個onClick函式中如果使用this的話,則返回的是這個AlertDialog的context,所以要使用的是當前activity名.this 去使用,比如當前activity為 TestActivity,那麼在裡面就是用TestActivity.this即可

 3. getApplication():

getApplication只能被Activity和Services使用,雖然在現在的Android的實現中,getApplication和getApplicationContext返回一樣的物件,但也不能保證這兩個函式一樣(例如在特殊的提供者來說),所以如果你想得到你在Manifest檔案裡面註冊的App class,你不要去呼叫getApplicationContext,以為你可能得不到你所要的app例項(你顯然有測試框架的經驗)。。。。

翻譯完成,一目瞭然(哪裡翻譯錯誤,請指出,水B一隻),原文:

getApplication() is available to Activity and Services only. Although in current Android Activity and Service implementations, getApplication() and getApplicationContext() return the same object, there is no guarantee that this will always be the case (for example, in a specific vendor implementation). So if you want the Application class you registered in the Manifest, you should never call getApplicationContext() and cast it to your application, because it may not be the application instance (which you obviously experienced with the test framework).

4. getParent() :

返回activity的上下文,如果這個子檢視的話,換句話說,就是當在子視圖裡面呼叫的話就返回一個帶有子檢視的activity物件,一目瞭然。。。

5.getActivity():

在fragment中使用,返回該fragment所依附的activity上下文

6.this

記住Activity,Service類,Application類是繼承自Context類的,所以在有的時候需要上下文,只需要使用this關鍵字即可,但是有的時候再執行緒裡面,this關鍵字的意義就改變了,但這個時候如果需要上下文,則需要使用 類名.this,這樣就可以了

這裡有點注意的:

做專案時遇見的,提一下吧,動態註冊廣播,在呼叫registerBroadcast函式的時候,需要傳入一個上下文和broadcastReceiver,檢視原始碼可以知道,儲存的時候context是作為一個key的作用,所以使用同一個context來註冊同一個廣播,onreceive只會呼叫一次,但是如果使用不同的context,則會呼叫多次,雖然不呼叫unregisterBroadcast有時也沒事,不會報錯,但是一定不要忘記取消登出

後續:為了簡化context的使用方法,現在有這麼一種方法,就是在Application類裡面維護一個弱引用:

1 2 3 4 /** 用來儲存當前該Application的context */  private static Context instance;  /** 用來儲存最新開啟頁面的context */  private volatile static WeakReference<Context> instanceRef = null;

再寫一個方法,

1 2 3 4 5 6 7 8 9 10 11 12

相關推薦

Android各種獲取Context方法

首先講一講這四個函式的區別,後面還有我對context的一些理解 區別如下所示: 翻譯+我的總結如下 1. getApplicationContext() : 這個函式返回的這個Application的上下文,所以是與app掛鉤的,所以在整個生命週期裡面都是不變的,這個好理解,但是使用的時

Android全文獲取context(上下文)的方法

給大家帶來一個簡單的在全文獲取context的方法 具體思路是在MyApplication裡面定義一個方法,可以在全文呼叫: 建立MyApplication類繼承Application: public class MyApplication extends

Android各種佈局居中方法

TableLayout以及LinearLayout居中的方式: 實現它的每單元格內容居中很簡單,給它的上一級設定android:gravity="center"即可,需去掉下一級所有跟居中有關的屬性,因為這也是使用就近原則的。 RelativeLayout的子空間裡,使

各種獲取context(ServletContext VS ApplicationContext)

為這麼突然會想到獲取context呢,主要是最近在做一個需求實現時,需要在伺服器端弄一個定時器去定時檢測客戶端是否正常工作。客戶端會定時發請求告訴伺服器端“我很正常” 如果在規定的時間內不能收到客戶端的

android全域性獲取Context物件(在靜態函式中實現toast)

全域性獲取Context物件的意義: 當應用程式的架構逐漸複雜起來的時候,很多邏輯程式碼都將脫離Activity或者Service,但是如果此時你又恰恰需要使用Context,這個時候就需要用到全域性獲取Context了。 舉個例子,如果此時需要實現一個從網路獲取圖片

Android 全域性獲取Context(隨時隨地的使用Context

參考:《第一行程式碼》第13章 ##################################################### 很多地方都需要使用Context,彈出Toast/啟動活動/傳送廣播/操作資料庫/使用通知等 活動(Activity)本身就是一

Android開發技巧】Fragment中獲取Context物件的兩種方法

我們在使用Fragment的時候經常需要傳遞Context型別的引數,【Android用的比較多的就是下面幾個導航按鈕,點選切換fragment(之前Android studio2.0以前是可以new fragment(context)時傳遞Context,但後來升級了studio2.1.2之後,new

Android中的Context幾種獲取方法和區別

1、Context概念 Context,相信不管是第一天開發Android,還是開發Android的各種老鳥,對於Context的使用一定不陌生~~你在載入資源、啟動一個新的Activity、獲取系統服務、獲取內部檔案(夾)路徑、建立View操作時等都需要Context的參

C#/Asp.Net 獲取各種Url的方法

response cnblogs app 1=1 site col bsp quest path 比如有:http://localhost:60527/WebSite1test/Default2.aspx?QueryString1=1&QueryString2=2

Android Studio獲取開發版SHA1值和發布版SHA1值的史上最詳細方法

nal code tail JD rip 通過 提示 打開 tor 前言:使用百度地圖時需要秘鑰,申請秘鑰時需要SHA1值,所以今天就總結一下怎麽獲取這個值。 正常情況下: 一、獲取開發版SHA1: 在此我直接用AndroidStudio提供的命令控制臺了,畢竟做Andro

spring裏頭各種獲取ApplicationContext的方法

角色 接口 uri 本地應用 創建 lis 問題 重新 import 為啥寫這個文章呢?spring各個版本不同,以及和系統框架套在一起不同,導致獲取的方式不同,網絡上各種版本,太亂了,寫獲取方式的人都不寫這個獲取方式是在本地還是在WEB

Android獲取Context(任意位置任意地方,全局上下文)

-type text 就會 etc lis ret 問題 normal 答案 一般獲取context的方法 1.Activity.this的context (一般用法)返回當前activity的上下文,屬於activity ,ac

[方法提煉] 獲取Android裝置序列號方法

通過這個方法可以檢測裝置是否連線成功,如果有一臺或者多臺裝置,可以將所有裝置序列號全部輸出 1 # -*- coding:utf-8 -*- 2 import os 3 4 def attachDeviceList(): 5 device_list = [] 6 cmd_

android應用 獲取本地指定型別檔案 的兩種最優方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

說說在 Android 如何在全域性獲取 Context

Android 提供了一個 Application 類,每當應用啟動時,系統就會初始化該類。我們可以定製一個基礎的 Application 類,以便管理應用內的一些全域性資訊。 定義 BaseApplication: public class BaseApplication

Android 手機獲取Mac地址的方法

轉載地址:https://blog.csdn.net/yushuangping/article/details/83245847 這期需求,要求從系統裝置上獲取一個唯一碼作為當前登入使用者的唯一標識,最後決定採用mac地址。 第一種: 官方獲取

Android Studio獲取開發版SHA1值和釋出版SHA1值的史上最詳細方法

前言: 今天我想把百度地圖的定位整合到專案中來,想寫個小小的案例,實現一下,但在整合百度地圖時首先要申請祕鑰,申請祕鑰要用到SHA1值,所以今天就來總結一下怎樣去獲取這個值吧,希望對大家有幫助。 正常情況下: 一、獲取開發版SHA1: 在此我直接用Android

Android 主動獲取電量的方法

IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(receiver,filter); 接收到廣

Android手機各種截圖方法

/** * 螢幕相關的輔助類 * * @since 2015-05-27 * @author lixi */ public class ScreenUtils { private ScreenUtils() { throw new UnsupportedOper

Android中全域性獲取Context

在日常開發中,很多情景都需要用到Context,例如:Toast,啟動活動,傳送廣播,操作資料庫,使用通知等等。如果在活動中進行這些操作倒是沒有什麼難點,活動本身就是Context。當架構複雜,程式碼邏輯脫離Activity時,就需要自定義一個全域性Context以供呼叫。 Android提