股票场内基金交易,没时间盯盘?
概述
本篇文章主要有两方面内容:
– Application 类介绍
– android-starter-kit 框架中的应用
Application
要想较为详细的了解这个类,我们需要注意一下几个方面。
1、Application 是什么?
在Android源码中描述如下:
Base class for those who need to maintain global application state. You can
provide your own implementation by specifying its name in your
AndroidManifest.xml’s tag, which will cause that class
to be instantiated for you when the process for your application/package is
created.
我们在平时的开发中,有时候可能会需要一些全局数据,来让应用中的所有Activity和View都能访问到,大家在遇到这种情况时,可能首先会想到自己定义一个类,然后创建很多静态成员。
但是这种方法不符合Android的框架架构,不过andorid已经为我们提供了这种情况的解决方案:在Android中,有一个名为Application的类,我们可以在Activity中使用getApplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性,让整个 App 的 Activity 和 View 都能访问到。
Android 系统会为每个程序运行时创建一个 Application 类的对象且仅创建一个,所以Application 可以说是单例 (singleton) 模式的一个类。
Application 对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。
它是全局的单例的,所以在不同的 Activity,Service 中获得的对象都是同一个对象,因此可以通过 Application 来进行一些,数据传递,数据共享,数据缓存等操作。
Application 类的作用如下:
– Application 是一个基类,这个基类的作用是获取整个 App 的状态,我们需要自己定义一个类来继承这个基类。
– 定义一些全局的和一些上下文都要用到的变量和方法。
2、Application 与 Context
Activity、Service、Application 都是 Context 的子类。Context 是一个抽象类,具体的实现是在ContextImpl 类中。因此应用程序 App 共有的 Context 数目公式为:
总 Context 实例个数 = Service 个数 + Activity 个数 + 1( Application 对应的 Context 实例)
3、通过 Application 传递数据
假如有一个 Activity A, 跳转到 Activity B ,并需要推荐一些数据,通常的作法是 Intent.putExtra()
让 Intent 携带,或者有一个 Bundle 把信息加入 Bundle 让 Intent 推荐 Bundle 对象,实现传递。但这样作有一个问题在于, Intent 和 Bundle 所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable 或者 Parcellable 接口。这其实是 Android 的一种 IPC 数据传递的方法。如果我们的两个 Activity 在同一个进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
基本思路是这样的。在 Application 中创建一个 HashMap以字符串为索引,Object 为 value 这样我们的 HashMap 就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个 HashMap ,然后通过 Intent 或者其它途经再把这索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在 HashMap 中取出这个对象了。只要再向下转个型 ,就实现了对象的传递。
4、Application数据缓存
可以在 Application 中建立两个 HashMap,一个用于数据的传递,一个用于缓存一些数据。比如有一个 Activity 需要从网站获取一些数据,获取完之后我们就可以把这个数据 cache 到 Application 当中,当页面设置到其它 Activity 再回来的时候,就可以直接使用缓存好的数据了。但如果需要 cache 一些大量的数据,最好是 cache 一些 (软引用) SoftReference ,并把这些数据 cache 到本地 rom 上或者 sd卡上。如果在 Application 中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网络上获取。
5、有关内存泄露
内存泄露的主要原因之一,就是对 Context 的引用超过它本身的生命周期。
一个较好的解决办法就是,使用使用 Application 这种 Context 类型。
6、生命周期
- onCreate :在创建应用程序时创建。
- onTerminate :当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程。
- onLowMemory :当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。
- onConfigurationChanged :配置改变时触发这个方法。
7、使用方法
通常我们是不需要指定一个 Application 的,系统会自动帮我们创建,如果需要创建自己的 Application,那也很简单!创建一个类继承 Application 并在 AndroidManifest.xml
文件中的 application
标签中进行注册(只需要给 application
标签增加 name
属性,并添加自己的 Application 的名字即可)。
实现步骤:
– 继承 Application
– 在 ApplicationManifest.xml
文件中配置自定义的 Application
下面,我们具体看一下在 android-starter-kit
框架中的 Application 类用法。
SupportApp 源码分析
框架以及 Demo 中有关 Application 类的继承关系情况如下图:
简要介绍一下这几个类中的一些方法。
SupportApp
该 Application 类是框架的 Application 类,当我们利用框架搭建自己的 App 时,可以继承此类,并添加自己的变量。
首先,SupportApp 定义了四个 volatile 修饰的变量,分别是:
Context,SupportApp,Handler 和 AppInfo。
volatile 可以保证变量在多个线程可见(会强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取值),确保每次取到的都是最新值。
Context 获取到的是该 Application 的 Context;
SupportApp运用单例模式,保证了只会出现一个SupportApp变量(具体怎么实现后面会具体说明);
Handler 构造时使用了该 Application 的Context,在需要使用Handler的地方直接调用函数appHandler()即可获取Handler,可以避免在其他 Activity 中创建 handler 造成的内存泄露问题。
AppInfo是一个工具类,里面包含了App的各种信息。
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private static volatile Context sAppContext; private static volatile SupportApp mInstance; private static volatile Handler sAppHandler; private static volatile AppInfo mAppInfo; @Override public void onCreate() { super.onCreate(); initialize(); } @Override public void onTerminate() { super.onTerminate(); sAppContext = null; mInstance = null; sAppHandler = null; mAppInfo = null; } |
enterApp()
方法,判断是否第一次进入 App:
使用了配置文件工具 Prefs
,该开源库地址:Prefs ,主要处理 SharedPreference 相关操作。
DemoApp
设置 debug 模式:
1 2 3 4 5 |
// common config new StarterKit.Builder() .setDebug(BuildConfig.DEBUG) .build(); |
再配置RetrofitBuilder:
1 2 3 4 5 |
new RetrofitBuilder.Builder() .accept(Profile.API_ACCEPT) .baseUrl(Profile.API_ENDPOINT) .build(); |
以及:
1 2 |
Fresco.initialize(appContext()); |
Retrofit 与 Fresco 都是开源框架中所用到的库。
总结
最后总结一下 Application 类的特点:
- 生命周期随着应用程序的销毁而销毁。
- App的进程被创建时,这个类就会被实例化,onCreate()方法就会被执行,是整个程序的入口。
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。