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,所以直接通过getResources()获取资源 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>
运行发现手机已经装了MainActivity和Main2,打开MainActivity为图片,打开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) {
//保存时获取Application,类型为自定义的App,获取信息保存到全局的Context里边
((App)getApplicationContext()).setTextData(editText.getText().toString());
textView.setText("共享的数据是:"+getApp().getTextData()); } }); } public App getApp(){ return (App) getApplicationContext(); } }
运行可以看到共享数据是 default,输入 wshlin ,点保存,可以看到共享数据变为 wshlin 。退出打开Main2,看到共享的数据为 wshlin,修改为kkk,退出打开Main,发现共享数据为 kkk。
也就是说,在多个 activity 里边,我们可以使用 Application 来进行数据的共享。因为 Application 对于同一个应用来说是唯一的。
====================================转载========================
作者:wshlin
链接:https://www.jianshu.com/p/cba902e68481
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。