Application浅析 | 青训营笔记

120 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第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启动。 不知道有什么用(