这是我参与「第四届青训营 」笔记创作活动的第9天 今天的内容是Application浅析
Application类
application是应用程序中除了activity之外的另一个context,顾名思义,它就像是“应用程序”本身。因此,它拥有与应用程序相同的生命周期,并且拥有对全局资源的访问权限,此外它还可以监控Activity的声明周期。
Application类的注册
一个应用程序只能有一个application实例,默认情况下会自动创建一个。如果要自己编写一个,就需要让一个类继承Application,并且在androidmanifest文件中为application添加android:name属性:
public class App extends Application {
...
}
android:name设置为自己编写的类名。
<application
android:name=".App"
... >
...
</application>
这样,应用程序就会以App类作为Application实例。
利用Application获取/传递全局资源
由于Application也是Context的一种,因此它也可以解析R文件中的内容。例如在res/values/strings.xml中添加:
<string name="qaq">qaq</string>
就可以使用Application直接进行访问,首先定义getApp()方法:
private App getApp() {
return (App) getApplicationContext();
}
然后在Activity中调用,可以看到解析全局资源呈现出来的内容。
textView.setText("资源字符串的内容是: " + getApp().getString(R.string.qaq));
另一种方法是利用应用程序只有一个application,并且每个activity都可以通过调用getApplicationContext()获得application的特性,在App类中添加字段。
public class App extends Application {
private String textData = "default";
public String getTextData() {
return textData;
}
public void setTextData(String textData) {
this.textData = textData;
}
}
上述代码添加了字段textData和它的访问器与修改器,可以在IDEA或AS中通过code->generate->getter and setter来自动生成,注意鼠标光标必须位于类定义的大括号内,否则generate可能只有copyright选项
接下来,可以编写两个activity,在一个activity中设置,启动另一个activity,再在另一个activity中显示。这部分内容就是之前讲过的了: 在MainActivity.java中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
textView = findViewById(R.id.textView);
editText = findViewById(R.id.editText);
findViewById(R.id.button).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
getApp().setTextData(editText.getText().toString());
textView.setText("共享的数据是: " + editText.getText().toString());
}
}
);
findViewById(R.id.button2).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, MainActivity2.class));
}
}
);
}
在MainActivity2.java中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView = findViewById(R.id.textView);
textView.setText("共享的数据是: " + getApp().getString(R.string.qaq));
}
Application生命周期
启动应用程序时,首先创建Application并调用其onCreate()方法。关闭程序时,如果在虚拟环境下会回调onTerminate()方法。注意,Application的onCreate比Activity的onCreate先被调用,这个特性使得Application的onCreate成为初始化内容的好时机。
在应用的运行过程中,Application还有如下几个生命周期:onLowMemory(),onTrimMemory(),onConfigurationChanges(),分别对应于低内存、内存清理和配置改变,程序可以做相应的资源释放和布局改变来响应这些事件。
从多个Activity启动应用程序
可以让两个Activity在AndroidManifest中都包含下列内容
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
这样会为应用程序生成两个图标,分别从不同的Activity启动。 不知道有什么用(