一、Application的生命周期
1、如果有这样的需求
资源不需要持久化,放到内存里就可以了
希望多个组件都可以访问这个数据
希望它是个可以操作的全局变量
可以使用Application这个组件
2、Application是Android的一大组件,在App运行过程中有且仅有一个Application对象贯穿整个生命周期
3、Application组件方法说明
(1)onCreate:在App启动时调用,可以在这里做准备工作
(2)onTerminate:(只在模拟环境上有效)在App终止时调用,可以在这里做善后的工作
这个接口是给Android系统开发工程师用的,不是Android应用开发工程师用
(3)onConfigurationChanged:在配置改变的时候调用,例如从竖屏变为横屏
屏幕旋转,Activity会重新创建,此时页面上表单填的内容都会消失。可以用ViewModel来解决
4、例子
MyApplication.java
package com.example.chapter06; import android.app.Application; import android.content.res.Configuration; import android.util.Log; import androidx.annotation.NonNull; public class MyApplication extends Application { // 在App启动时调用 @Override public void onCreate() { super.onCreate(); Log.d("sam", "MyApplication onCreate"); } // 在App终止时调用 @Override public void onTerminate() { super.onTerminate(); Log.d("sam", "MyApplication onTerminate"); } // 在配置改变的时候调用,例如从竖屏变为横屏 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d("sam", "MyApplication onConfigurationChanged"); } }MainActivity.java
package com.example.chapter06; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("sam", "MainActivity onCreate"); } }AndroidManifest.xml清单文件application标签下添加android:name=".MyApplication"
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>5、日志
竖屏变成横屏
二、利用Application操作全局变量
1、Application的数据可以让Activity共享
2、Application在整个应用中只有一个实例,所以在我们自定义的时候,需要使用单例模式来写构造方法
改造MyApplication.java
package com.example.chapter06; import android.app.Application; import android.content.res.Configuration; import android.util.Log; import androidx.annotation.NonNull; import java.util.HashMap; public class MyApplication extends Application { private static MyApplication mApp; // 声明一个公共的信息映射对象,可当做全局变量使用 public HashMap<String, String> infoMap = new HashMap<>(); public static MyApplication getInstance() { return mApp; } // 在App启动时调用 @Override public void onCreate() { super.onCreate(); mApp = this; // 在onCreate初始化实例 Log.d("sam", "MyApplication onCreate"); } // 在App终止时调用 @Override public void onTerminate() { super.onTerminate(); Log.d("sam", "MyApplication onTerminate"); } // 在配置改变的时候调用,例如从竖屏变为横屏 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d("sam", "MyApplication onConfigurationChanged"); } }使用:
MyApplication mApp = MyApplication.getInstance(); mApp.infoMap.put("name", name); mApp.infoMap.put("age", age);3、适合在Application中保存的全局变量主要有下面3类数据
(1)会频繁读取的信息,如用户名、手机号等
(2)不方便由Intent传递的数据,例如:位图对象、非字符串类型的集合对象等
(3)容易因频繁分配内存而导致内存泄漏的对象,如Handler对象等