Context
是Android中一个非常重要的概念,用于访问全局信息,几乎所有的基础组件都继承自 Context,理解 Context 对于学习 Android 四大基本组件非常有帮助。
1. Context作用
新建一个LearnContext工程,看如何通过Context来进行资源的访问。
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传入一个字符串
System.out.println(getResources().getText(R.string.app_name)); // 当前的avtivity是一个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);
}
}
这样运行就会看到安卓机器人的图片了
Context作用:访问全局信息的接口,比如全局的字符串,图片资源等。
2. Application用途
多个组件之间数据共享,前面了解了Context可以作为全局信息的桥梁。
新建一个类App,让它继承至Application,配置AndroidMainfset:
<application
android:name=".App" //new add
通过这种方式,我们就自定义了 Android 的 Application 。而 Application 才是一个真正的全局上下文对象。
App.java
public class App extends Application {
private String textData = "default";
public void setTextData(String textData) {
this.textData = textData;
}
public String getTextData() {
return textData;
}
}
然后新建一个类 Main2 继承至 Activity,重写 onCreate()。添加注册信息:
把这个Activity也设置为启动的。
<activity
android:name=".Main2"
android:label="Main2"> //同时将第一个Aty的label设为Main1。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
运行发现手机已经装了Main1和Main2,打开Main1为图片,打开Main2为空白。
接下来在layout文件夹中创建 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,拖进一个 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("共享的数据是:"+getApp().getTextData());
findViewById(R.id.btnSaveData).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((App)getApplicationContext()).setTextData(editText.getText().toString()); //保存时获取Application,类型为自定义的App,获取信息保存到全局的Context里边
textView.setText("共享的数据是:"+getApp().getTextData());
}
});
}
public App getApp(){
return (App) getApplicationContext();
}
}
同样的代码添加一份到 Main2.java 。
运行可以看到共享数据是 default,输入 wshlin ,点保存,可以看到共享数据变为 wshlin 。退出打开Main2,看到共享的数据为 wshlin,修改为kkk,退出打开Main,发现共享数据为 kkk。
也就是说,在多个 activity 里边,我们可以使用 Application 来进行数据的共享。因为 Application 对于同一个应用来说是唯一的。