Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

Application全局应用

阅读数:次 2020-12-07
字数统计: 973字   |   阅读时长≈ 4分

Application是维护应用全局状态的基类,Android系统会在启动应用进程时创建一个对应的Application对象。所以当我们需要创建全局变量的时候,不需要再像Java那样需要创建public权限的static变量,而直接在Application中去实现。其他组件只需要调用Context的getApplicationContext或者getApplication(在Activity中)来获得一个Application对象,再做出相应的处理。

自定义Application

我们可以通过创建一个子类,并在AndroidManifest.xml的<application>标签中将该子类的标准名称指定为”android:name” 属性来设定为自己的实现类。

1
2
3
public class MyApplication extends Application {
// ...
}

AndroidManifest.xml:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.tim.custom_application">
<application
android:name=".MyApplication"
...
android:theme="@style/AppTheme">
...
</application>
</manifest>

MainActivity.java

1
2
3
4
5
6
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: " + getApplication());
}

打印出来的确实自定义的Application类对象:

1
MainActivity: onCreate: cn.tim.custom_application.MyApplication@9e7a3660

Application对象生命周期

Application对象诞生于其它任何组件对象之前,并且一直存活,直到应用进程结束。Application对象由Android系统管理,它的回调函数都运行于UI线程。

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
public class MyApplication extends Application {
private static final String TAG = "MyApplication";

// Application对象被创建的时候会调用
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate: " + this);
Log.i(TAG, "onCreate: " + Thread.currentThread());
}

// 系统配置变更,如横屏变成竖屏、系统语言更改
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(TAG, "onConfigurationChanged: " + newConfig );
}

// 系统内存吃紧的时候被调用
@Override
public void onLowMemory() {
super.onLowMemory();
Log.i(TAG, "onLowMemory: ");
}
}

Application对象的作用

Application对象全局可访问,且全程陪同应用进程。所以特别适合完成以下任务:初始化全应用所需的服务、共享全局状态、监听配置信息改变、监听Activity生命周期

初始化全应用所需的服务:在 Application 对象被创建时会调用 onCreate()方法,此时用来初始化全应用所需的服务是个不错的选择,但是最好执行耗时操作,否则会拖慢应用程序启动速度。

共享全局状态:另外使用Application对象实现数据共享、数据缓存也是一个不错的选择。Application对象可以获取应用程序当前的内存使用情况,及时释放资源,从而避免被系统杀死。

监听配置信息改变:如屏幕旋转,系统语言切换等(下面是手机开启横屏的示例)。

监听Activity生命周期:监听应用程序内所有Activity的生命周期。

Application对象 VS 静态单例

Application对象与静态单例都可以实现应用全局状态的共享,以共享Otto的Bus对象为例:

1
implementation group: 'com.squareup', name: 'otto', version: '1.3.8'

这是使用Application对象进行全局共享的示例:

MyApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyApplication extends Application {
private Bus bus;

public Bus getBus() {
return bus;
}

@Override
public void onCreate() {
super.onCreate();
bus = new Bus();
}

...
}

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected void onResume() {
super.onResume();
MyApplication application = (MyApplication) getApplication();
Bus bus = application.getBus();
bus.register(this);
}

@Override
protected void onPause() {
super.onPause();
MyApplication application = (MyApplication) getApplication();
Bus bus = application.getBus();
bus.unregister(this);
}

这是使用静态单例进行全局共享的示例:
BusProvider.java

1
2
3
4
5
6
7
8
public class BusProvider {
private BusProvider(){}
private static final Bus bus = new Bus();

public static Bus getBus(){
return bus;
}
}

OtherActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected void onResume() {
super.onResume();
BusProvider.getBus().register(this);
Log.i(TAG, "onResume: bus = " + BusProvider.getBus());
}

@Override
protected void onPause() {
super.onPause();
BusProvider.getBus().unregister(this);
Log.i(TAG, "onPause: bus = " + BusProvider.getBus());
}

1、静态单例模块化程度更好
2、Application就是一个context,所以有访问资源的能力
3、静态单例可以接受context参数
4、Application对象能接收系统回调,自动知悉系统环境变化
5、Application对象的生命周期由系统控制

原文地址:《Application全局应用》

赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/12540.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • Android
  • 组件通信
  • 移动开发

扫一扫,分享到微信

后台默默的劳动者,探究服务
全局大喇叭——BroadcastReceiver
  1. 1. 自定义Application
  2. 2. Application对象生命周期
  3. 3. Application对象的作用
  4. 4. Application对象 VS 静态单例
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书