辉夜的博客

繁花似锦,辉夜如昼

0%

Android学习笔记(五)

Application类

application是应用程序中除了activity之外的另一个context,顾名思义,它就像是“应用程序”本身。因此,它拥有与应用程序相同的生命周期,并且拥有对全局资源的访问权限,此外它还可以监控Activity的声明周期。

Application类的注册

一个应用程序只能有一个application实例,默认情况下会自动创建一个。如果要自己编写一个,就需要让一个类继承Application,并且在androidmanifest文件中为application添加android:name属性:

1
2
3
public class App extends Application {
...
}

android:name设置为自己编写的类名。

1
2
3
4
5
<application
android:name=".App"
... >
...
</application>

这样,应用程序就会以App类作为Application实例。

利用Application获取/传递全局资源

由于Application也是Context的一种,因此它也可以解析R文件中的内容。例如在res/values/strings.xml中添加:

1
<string name="qaq">qaq</string>

就可以使用Application直接进行访问,首先定义getApp()方法:

1
2
3
private App getApp() {
return (App) getApplicationContext();
}

然后在Activity中调用,可以看到解析全局资源呈现出来的内容。

1
textView.setText("资源字符串的内容是: " + getApp().getString(R.string.qaq));

另一种方法是利用应用程序只有一个application,并且每个activity都可以通过调用getApplicationContext()获得application的特性,在App类中添加字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@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中:

1
2
3
4
5
6
7
8
9
10
@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中都包含下列内容

1
2
3
4
5
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

这样会为应用程序生成两个图标,分别从不同的Activity启动。
不知道有什么用(