Context
是Android中一個(gè)非常重要的概念,用于訪問全局信息荐绝,幾乎所有的基礎(chǔ)組件都繼承自 Context侣灶,理解 Context 對(duì)于學(xué)習(xí) Android 四大基本組件非常有幫助才漆。
1. Context作用
新建一個(gè)LearnContext工程乾胶,看如何通過Context來進(jìn)行資源的訪問。
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(MainActivity.this); //可只寫this
// tv.setText("Hello Android");
tv.setText(R.string.app_name); //利用資源的id傳入一個(gè)字符串
System.out.println(getResources().getText(R.string.app_name)); // 當(dāng)前的avtivity是一個(gè)Context,所以直接通過getR獲取資源
setContentView(tv);
}
}
除了可以獲取字符串資源外谴轮,它還可以獲取只要工程文件里邊存在任意類型的資源炒瘟。比如說圖片資源:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageView iv = new ImageView(this);
iv.setImageResource(R.mipmap.ic_launcher);
setContentView(iv);
}
}
這樣運(yùn)行就會(huì)看到安卓機(jī)器人的圖片了
Context作用:訪問全局信息的接口,比如全局的字符串第步,圖片資源等疮装。
2. Application用途
多個(gè)組件之間數(shù)據(jù)共享,前面了解了Context可以作為全局信息的橋梁粘都。
新建一個(gè)類App廓推,讓它繼承至Application,配置AndroidMainfset:
<application
android:name=".App" //new add
通過這種方式翩隧,我們就自定義了 Android 的 Application 樊展。而 Application 才是一個(gè)真正的全局上下文對(duì)象。
App.java
public class App extends Application {
private String textData = "default";
public void setTextData(String textData) {
this.textData = textData;
}
public String getTextData() {
return textData;
}
}
然后新建一個(gè)類 Main2 繼承至 Activity堆生,重寫 onCreate()专缠。添加注冊(cè)信息:
把這個(gè)Activity也設(shè)置為啟動(dòng)的。
<activity
android:name=".Main2"
android:label="Main2"> //同時(shí)將第一個(gè)Aty的label設(shè)為Main1淑仆。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
運(yùn)行發(fā)現(xiàn)手機(jī)已經(jīng)裝了Main1和Main2,打開Main1為圖片涝婉,打開Main2為空白。
接下來在layout文件夾中創(chuàng)建 main1.xml 和 main2.xml ,并綁定視圖糯景。
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
}
}
Main2.java
public class Main2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
}
}
回到 main1.xml嘁圈,拖進(jìn)一個(gè) PlainTextView省骂,PlainText 和 Button:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_gravity="center_horizontal" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存"
android:id="@+id/btnSaveData" />
拷貝一份到main2.xml
使用相同布局,去到MainActivity.java
:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
textView = (TextView) findViewById(R.id.textView); //獲取資源
editText = (EditText) findViewById(R.id.editText);
textView.setText("共享的數(shù)據(jù)是:"+getApp().getTextData());
findViewById(R.id.btnSaveData).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((App)getApplicationContext()).setTextData(editText.getText().toString()); //保存時(shí)獲取Application,類型為自定義的App蟀淮,獲取信息保存到全局的Context里邊
textView.setText("共享的數(shù)據(jù)是:"+getApp().getTextData());
}
});
}
public App getApp(){
return (App) getApplicationContext();
}
}
同樣的代碼添加一份到 Main2.java 。
運(yùn)行可以看到共享數(shù)據(jù)是 default钞澳,輸入 wshlin 怠惶,點(diǎn)保存,可以看到共享數(shù)據(jù)變?yōu)?wshlin 轧粟。退出打開Main2策治,看到共享的數(shù)據(jù)為 wshlin脓魏,修改為kkk,退出打開Main通惫,發(fā)現(xiàn)共享數(shù)據(jù)為 kkk茂翔。
也就是說,在多個(gè) activity 里邊履腋,我們可以使用 Application 來進(jìn)行數(shù)據(jù)的共享珊燎。因?yàn)?Application 對(duì)于同一個(gè)應(yīng)用來說是唯一的。