當前位置:首頁 » 安卓系統 » android上下文

android上下文

發布時間: 2023-03-22 23:40:25

A. 自己關於Android上下文對象的理解

  Android中有個我們熟悉又陌生的對象Context(上下文),當我們啟動Activity的時候需要上下文,當我們使用dialog的時候我們需要上下文,但是上下文對象到底是個什麼東西呢?

  在Android api當中是這樣描述context對象的。

"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."

「是一個用於實現關於應用環境的整體信息的一個介面。這是一個由安卓系統提供的抽象類並且系統有對他進行實現。它允許訪問到應用特殊的資源和類,同時它也可以實現到應用級別的操作,例如:Activity的啟動,廣播的實現和接受intent等。」

一、Context的主要實現和繼續理解

  知道了context的大概描述,我們可以再繼續理解Context這個神秘的對象了,首先,作為基類,肯定有其它類去實現它,主要實現了context類的類是Activity,Service,Application。他們三個類雖然都是Context的子類,但是具體的繼承關系卻有些不大一樣:

Activity的繼承關系:

Service和Application的繼承關系:

  可以看出我們的Context其實就是我們熟知的Activity,Service,Application。

  在這3個類中,Activity的context對象和Application的context對象最容易弄混淆。

二、Context中的主要方法

  知道了Context的大概描述和他的一些繼承關系,我們對Context這個類有了一個大致的了解。現在可以看看在context中的一些方法,來加深對context的一個理解,有很多我們使用過的方法其實都是從Context這個類中實現而來。

  我們從Android api中查看Context類,這里出現了一個非常熟悉的方法:startActivity,可以看到其實Activity中的StartActivity方法是重寫了Context中的方法。

abstract void startActivity ( Intent intent)

Same as startActivity(Intent, Bundle) with no options specified.

abstract void startActivity ( Intent intent, Bundle options)

Launch a new activity.

同時context還可以訪問到資源文件,獲得資源文件中的信息。

abstract Resources getResources ()

Return a Resources instance for your application's package.

abstract SharedPreferences getSharedPreferences ( String name, int mode)

Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values.

final String getString (int resId)

Return a localized string from the application's package's default string table.

final String getString (int resId, Object... formatArgs)

Return a localized formatted string from the application's package's default string table, substituting the format arguments as defined in Formatter and format(String, Object...) .

同時context不但可以開啟一個activity,同時還可以開啟或者關閉一個Service。

abstract ComponentName startService ( Intent service)

Request that a given application service be started.

abstract boolean stopService ( Intent service)

Request that a given application service be stopped.

  訪問Android Api 或者查看源碼可以看到,Context中還有很多訪問資源文件和程序之間互相通信的方法。

  可以看出context其實就是一個應用之中的手腳,可以通過他來拿取資源文件中的資源,還可以通過他來處理Activity和Service中的一些操作,這個類就是整個程序的樞紐,負責管理整個程序的通暢運行。

  我們可以通過分析一個Toast通知的源碼去分析context的去向和使用,來了解context到底做了些神馬操作:

public static Toast makeText(Context context, CharSequence text, int ration) {

   Toast result = new Toast(context);

   LayoutInflater inflate = (LayoutInflater)

   context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

   View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

   TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);

   tv.setText(text);

   result.mNextView = v;

   result.mDuration = ration;

   return result;

}

可以看到makeText方法接受的context被用於

context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

  這是用於獲取XML中定義的View的方法,可以看到通過外部傳入的Context,在這里獲得了一個View布局用於顯示Toast。

public Toast(Context context) {

   mContext = context;

   mTN = new TN();

   mTN.mY = context.getResources().getDimensionPixelSize(

   com.android.internal.R.dimen.toast_y_offset);

   mTN.mGravity = context.getResources().getInteger(

   com.android.internal.R.integer.config_toastDefaultGravity);

}

  這一行中可以看出在context又被用來獲取資源文件,可以看出Toast的顯示和布局都是通過context去調用系統寫好的資源文件來進行實現的。

三、Activity context和Application context的區別

  Activity的context和Application的context的區別在於生命周期的區別,Activity的context是依附在著Activity的生命周期的,而Application的Context的生命周期是依附在整個應用之上的。

B. 如何理解android中的上下文對象(Context對象)

Context,中文直譯為「上下文」,SDK中對其說明如下:
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。
從上可知一下三點,即:

1、它描述的是一個應用程序環境的信息,即上下文。
2、該枯纖類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現類(後面我們會講到畝茄是ContextIml類)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一迅敗察個Activity,發送廣播,接受Intent信息等。

C. android中能否有兩個opengl上下文

不能。
OpenGL本身就是一個非常龐大的狀態機(State Machine) ,其狀態通常被稱為OpenGL上下文(Context)。它裡面保存了一系列的變數用來描述OpenGL此刻需要如何運行,比如拍照時候要開啟濾鏡功能等等。
OpenGL使用C語言編寫的,進而他的Api的封裝也都是面向過程的,其函數本質上都是對OpenGL上下文狀態機中的某個狀態或者對象進行操作。
應用程序中可以創建多個不同的上下文,他們分別在各自的線程中使用。上下文之間共享紋理,緩沖區等資源,採用這中方案更為高效,因為它避免了反復切換上下文,或者大量修改渲染狀態所造成的較大的開銷。

D. android怎麼實現listview置頂和取消置頂上下文菜

1、首先你要實現ListView。
2、其次是要自己繼承Arrayadapter。
3、最後,因為要用枝滾到數據的排序,所以使用Arrayadapter綁定你的數據即可。Android是一個開源的,基於Linux的移動設備操作系統,主要使用於移動設備穗搭旁,如智能手機和平板電腦猜橡。

E. 對於android裡面的content不理解,查找說這個是上下文,但是我還是沒有這個概念,什麼是上下文求大神講解

Context 吧
Context字面意思上下文,位於framework package的android.content.Context中,
其實該類為LONG型,類似Win32中的Handle句柄,
很多方法需要通過 Context才能識別調用者的實例,
比如說Toast的第一個參數就是Context,一般在Activity中我們直接用this代替,
代表調用者的 實例為Activity,而到了戚賀一個button的onClick(View view)等方法時,
我們用this時就會報錯,所以我們可能使用ActivityName.this來解決,
主要原因是因為實現Context的類主要有Android特有的幾個模型,
Activity、Service以及BroadcastReceiver。
Context提供了關於應皮畝用環境全局信息的介面。它是一個抽象類,它的執行被Android系統所提供。它允許獲取以應用為特徵的資源和類型。同時啟動應用級的操作,如啟動Activity,broadcasting和接收intents。

兩種類型的Context
在android中context可以作很多操作,但是最主要的功能是載入和訪問資源。
在android中有兩種context,一種是 application context,一種是activity context,通常我們在各種類和方法間傳遞的是activity context。

application context
我們可以使用application context。application context伴隨application的一生,與activity的生命周期無關。
application context可以通過Context.getApplicationContext或者Activity.getApplication方法獲取。這個context 實燃仔森際就是在AndroidManifest.xml application 節點定義的類

F. Android下使用chcon修改文件的安全上下文(file_contexts)

spm8666p1_64:/system/bin # ls -Z otaclient*
u:object_r:otaclient_exec:s0 otaclient
u:object_r:otaclient_exec:s0 otaclient_bak
spm8666p1_64:/system/bin #

chcon u:object_r:otaclient_exec:s0 otaclient

G. Android選擇條目時下方出現菜單選項

底部是菜單欄,點擊就可以查看。
菜單是用戶界面中最常譽運見的元素之一,使用非常頻繁,在Android中,菜單被分為如下三種,選項菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu),以下說的是創建OptionsMenu。
默認樣式好虛含是在屏幕底部彈出一個菜單,這個菜單我們就叫他選項菜單OptionsMenu,一般情況下,選項菜單最多顯示2排每排3個菜單項,這些菜單項有文字有圖標,也被稱作Icon Menus,如果多於6項,從第六項開始會被隱藏,在第六項會出現一個More里,點擊More才出現第六項以及以後的菜單項,這些菜友笑單項也被稱作Expanded Menus。

H. Android Activity 和 上下文Context 的關系

首先看繼承關系:

可以看到Activity繼承於ContextThemeWrapper,ContextThemeWrapper繼承於ContextWrapper,ContextWrapper繼承於Context。也就是說,Context是Activity的父類。


相關延伸:

說到Activity與Context關系,少不了Application與二者的關系,上圖可以明確看到Context是Application的父類,那麼對於參數傳遞,需要傳遞Context對象的時候,

我們是傳activity.this還是this.getApplicationContext()呢?

activity的生命周期肯定沒有application長,所以為了防止內存泄露:

  1. 只要application可以滿足的就傳this.getApplicationContext()。比如用來ShowToast、獲取LayoutInflater對象、獲取資料庫對象、獲取SharedPreferences對象、發廣播context.sendBroadcast等,都可以傳this.getApplicationContext()。

  2. application不能滿足的必須傳activity。比如showDialog、activity之間跳轉等。

I. Android基礎知識

一、activity

1.一個activity就是一個類,繼承activity;

2.需要復寫onCreate()方法;

3.每一個activity都需要在AndroidMainfest.xml清單上進行配置;

4.為activity添加必要的控制項。

二、布局

線性布局:LinearLayout

1.填滿父空間:fill_parent、match_parent

2.文本多大空間就有多大:warp_content

3.文字對齊方式:gravity

4.占屏幕的比例:layout_weight="1"  水平方向,則width=0,垂直方向,則height=0

5.一行顯示,空間不夠會省略:singleLine="ture"  false會換行

6.背景:background="#ffffff"

7.水平布局:orientation="horizontal"

垂直布局:orientation="vertivcal"

表格布局:TableLayout

1.內邊距:padding

2.外邊距:marginLeft\Start、Right\End、Top、Bottom

三、RelativeLayout相對布局

layout_above 將該控制項的底部置於給定ID控制項之上

layout_below 將該控制項的頂部置於給定ID控制項之下

layout_toLeftOf 將該控制項的右邊緣和給定ID控制項的左邊緣對齊

layout_toRightOf 將該控制項的左邊緣和給定ID控制項的右邊緣對齊

layout_alignBaseline 該控制項的baseline和給定ID的控制項的Baseline對齊

layout_alignBottom 該控制項的底部邊緣和給定ID的控制項的底部邊緣對齊

layout_alignLeft 該控制項的左邊緣和給定ID的控制項的左邊緣對齊

layout_alignRight 該控制項的右邊緣和給定ID的控制項的右邊緣對齊

layout_alignTop 該控制項的頂部邊緣和給定ID的控制項的頂部邊緣對齊

layout_alignparentBottom 如果該值為true,則該控制項的底部和父控制項的底部對齊layout_alignParentLeft 如果該值為true,則該控制項的左邊和父控制項的左邊對齊

layout_alignParentRight 如果該值為true,則該控制項的右邊和父控制項的右邊對齊

layout_alignParentTop 如果該值為true,則該控制項的上邊和父控制項的上邊對齊

layout_centerHorizontal 如果該值為true,則該控制項將被置於水平方向的中央

layout_centerInParent 如果該值為true,則該控制項將被置於父控制項水平和垂直方向的中央

layout_centerVertival 如果該值為true,則該控制項將被置於垂直方向的中央

四、一個Intent對象包含一組信息

1.Component name

2.Action

3.Data

4.Category

5.Extras

6.Flags

Intent intent = new Intent(this, SecondActivity.class);

startActivity(intent);  //startActivity方法

intent.putExtra("Key", "Value");  //鍵值對

intent = getIntent();

String value = intent.getStringExtra("Key");    //通過鍵提取數據

五、初級控制項:EditText、TextView、Button

1.獲取EditText的值

String value = EditText.getText().toString();

2.將值放到Intent對象中

Intent intent = new Intent();

intent.putExtra("one",value )

intent.setCalss(Activity.this, OtherActivity.class);

3.使用這個Intent對象來啟動Otheractivity

Activity.this.startActivity(intent);

4.將監聽器的對象綁定到按鈕對象上

button.setOnclickListener(new Listener());

5.得到Intent對象當中的值

Intent intent = getIntent();

String value1 = intent.getStringExtra("one");

int value2 = Integer.parseInt(value);

六、其他初級控制項使用

①ImageView

②RadioGroup和RadioButton

setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())

③Checkbox

setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())

④Menu

1.當客戶點擊MENU按鈕的時候,調用onCreateOptionMenu()方法

public boolean onCreateOptionMenu(Menu menu){

menu.add(0,1,1,R.string.id);

}

2.當客戶點擊MENU內部的具體某一個選項時,調用onOptionItemSelected()方法

public boolean onOptionItemSelected(MenuItem item){

if(item.getItemId() == 1){

finish();

}

return super.onOptionItemSelected(item);

}

七、Activity的生命周期

1.第一次創建時調用

protected void onCreat(Bundle saveInstanceState);

2.顯示出來時調用

protected void onStrat();

3.獲得用戶焦點時調用(可操作)

protected void onResume();

4.點擊彈出第二個Activity時調用

protected void onPause();

5.當第一個Activity不可見時調用

protected void onStop();

6.當返回第一個Activity時調用,代替OnCreate,因為沒被銷毀

protected void onRestart();

7.當返回第一個Activity時調用(先執行onStop,在執行,因為第二個Activity被銷毀,不能返回獲取,只能通過onCreat,onStart,onResume再創建)

protected void onDestory();

八、Task

1.Task是存放Activity的Stack棧。當點擊啟動第二個Activiry時,第一個Activtiy會被壓入Stack棧當中,第二個Activity會位於棧的頂部;當返回第一個Activtiy時,第二個Activity會被彈出Stack,第一個Activity會位於棧的頂部,以此類推。

注釋:當調用finish()時,當前的Activity會被Destory掉,棧中的Activity會消失。

2.當Activity都從Stack退出後,則就不存在Task。

九、高級控制項

①進度條ProgressBar

水平進度條style="?android:attr/progressBarStyleHorizontal"

圓圈進度條style="?android:attr/progressBarStyle"

用戶可視的visibility="gone"

②列表ListView

十、其他控制項

A.下拉菜單Spinner

1.創建一個ArrayAdapter:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(

this, //指上下文對象

R.array.plant_array, //引用了在文件中定義的String數組

android.R.layout.simple_spinner_item);//用來指定Spinner的樣式,可替換自定義

adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);//設置Spinner當中每個條目的樣式

2.得到Spinner對象,並設置數據:

spinner=(spinner)findViewById(R.id.spinnerId);

spinner.setAdapter(adapter);

spinner.setPrompt("測試");//標題

3.創建監聽器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView<?> adapterView,//整個列表對象

View view,//被選中的具體條目對象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView<?> adapterView){

S.o.p("nothingSelected");

}

}

4.綁定監聽器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

註:第二種動態設計

1.創建ArrayList對象

List<String> list = new ArrayList<String>();

list.add("test1");

2. 調用方法

ArrayAdapter adapter = new ArrayAdapter(

this, //指上下文對象

R.layout.item, //引用了指定了下拉菜單的自定義布局文件

R.id.textViewId,//id

list);//數據

3.得到Spinner對象,並設置對象

spinner.setAdapter(adapter);

spinner.setPrompt("測試");//標題

3.創建監聽器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView<?> adapterView,//整個列表對象

View view,//被選中的具體條目對象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView<?> adapterView){

S.o.p("nothingSelected");

}

}

4.綁定監聽器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

B.DatePicker和DatePickerDialog

1.聲明一個監聽器,使用匿名內部類

DatePickerDialog.OnDateSetListener onDateSetListener

= new DatePivkerDialog.OnDateSetListener(){

public void onDateSet(

DatePicker view,

int year,

int monthOfYear,

int dayOfMonth){

S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)

}

}

2.復寫onCreateDialog(int id)方法:

@override

protected Dialog onCreateDialog(int id){

switch(id){

case DATE_PICKER_ID:

return new DatePickerDialog(this,onDateSetListener,2019,11,25);

}

return null;

}

3.使用時調用showDialog()方法

showDialog(DATE_PICKER_ID);

C.AutoCompleteTextView

B.Widget

C.Animatin

十一、實現ContentProvider過程

1.定義一個CONTENT_URI常量

2.定義一個類,繼承ContentProvider

3.實現query、insert、update、delete、getType和onCreate方法

4.在AndroidManifest.xml當中進行聲明

J. android 上下文對象對象是什麼意思

你說的是Context吧,它代表的是某個類的團辯引用,比如
public class B{
private Context mContext;
public B(Context context){
mContext = context;
.......................
}
}
如果在class A中新建了塌臘缺一個class B的對局豎象,B b = new B(A.this);那麼B的構造方法中的context參數就是A的引用,在android中如果A是Activity那麼B中的mContext經過賦值後就可以像使用Activity一樣使用mContext,比如mContext.startActivity(..........);
((Activity)mContext).finish();等等

熱點內容
隕石密碼一般是多少 發布:2023-06-08 09:46:39 瀏覽:664
java中取絕對值 發布:2023-06-08 09:43:09 瀏覽:923
4指演算法算卦 發布:2023-06-08 09:41:17 瀏覽:500
蘋果手機忘記密碼怎麼解 發布:2023-06-08 09:40:39 瀏覽:401
c語言兩數交換 發布:2023-06-08 09:37:23 瀏覽:261
明日科技php 發布:2023-06-08 09:31:06 瀏覽:690
手游御龍在天腳本 發布:2023-06-08 09:27:12 瀏覽:167
android單元格合並單元格 發布:2023-06-08 09:26:26 瀏覽:837
第三腰椎壓縮性骨折 發布:2023-06-08 09:26:21 瀏覽:215
伺服器硬碟放到普通電腦不認 發布:2023-06-08 09:25:21 瀏覽:30