Android Application详解
16lz
2021-01-23
在 Android 中使用全局变量,除 public 静态变量,还有就是使用 android.app.Application。 Android系统 会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类所以在不同的Activity、Service中获得的对象都是同一个对象,所以通过 Application来进行一些,数据传递,数据共享等,数据缓存等操作。 在启动 Application 时,系统会创建一个 PID,就是 进程ID,所有的 Activity 会在此进程上运行,在创建 Application 时初始化全局变量,同一个应用的所有 Activity 都会获取这些全局变量的值,可用于保存登录状态。Application中的全局变量值会在 Activity中被改变,其生命周期等于整个程序的生命周期 注:1> 在 Application 类中,其onCreate()方法,是Android应用程序真正的入口,将会会在所有 Activity,Service,Receiver组件之前调用 2> 在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉
3> 在组件之间传递信息:在自定义的 Application中设置成员变量这样在Activity、Service、Fragment等之间通过获取Application实例来访问其中成员变量 4> 如果需要 cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在 Application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在,再从网络上获取 5> 使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。如果在Application的oncreate中执行比较 耗时的操作,将直接影响的程序的启动时间。一些清理工作不能依靠 onTerminate 完成,因为 Android会尽量让程序一直运行,所以很有可能 onTerminate不会被调用
使用方式 (1)在AndroidManifest.xml中在标签中添加android:name="...",其中设置 Applicationl类的 如: <application
(2)创建 Application 类,该类继承于 android.app.Application 如: public class CombankDroid extends Application {
(3)在Activity中使用,通过 Application 类实例,再通过该类中的方法获取相关数据 获取 在Service 和 Activity 中获取 Application 的三种方法: 1> getApplication() : 如 CombankDroid combankDroid = ((CombankDroid)getApplication()) 2> getApplicationContext() : 如 CombankDroid combankDroid = ((CombankDroid)getApplicationContext()) 3> getApplicationInstance() : 如 CombankDroid combankDroid = CombankDroid.getApplicationInstance() 注:getApplicationInstance()用在获取不到context对象的类中 4> 将要操作的属性设为静态方法就可以直接调用 如:MyApplication.info.getUserName() 如: class Anyhow extends Activity {
Application中存储数据存在的问题 由于Application 对象不会一直呆着内存里面,它会被kill掉,比如启动 App后将数据存储在Application中点击 Home 键离开App几小时后,再返回App,此时实际上App不会重新启动,Android 系统会创建一个新的Application对象,然后再启动上次用户离开时的Activity以此造成App从来没有被Kill掉的假象,此时在获取Appication中的数据将会出现异常。针对这种问题,可根据情况采用其它的方式:
1> 直接将数据通过intent传递给 Activity 2> 使用官方推荐的几种方式将数据持久化到磁盘上 3> 在使用Application中的数据时,总是要对变量的值进行非空检查 注:对 Application对象有用,对你app里面的单例对象(singleton)或者公共静态变量(public static)同样适用
3> 在组件之间传递信息:在自定义的 Application中设置成员变量这样在Activity、Service、Fragment等之间通过获取Application实例来访问其中成员变量 4> 如果需要 cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在 Application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在,再从网络上获取 5> 使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。如果在Application的oncreate中执行比较 耗时的操作,将直接影响的程序的启动时间。一些清理工作不能依靠 onTerminate 完成,因为 Android会尽量让程序一直运行,所以很有可能 onTerminate不会被调用
使用方式 (1)在AndroidManifest.xml中在标签中添加android:name="...",其中设置 Applicationl类的 如: <application
android:name=".CombankDroid" android:icon="@drawable/first_aid" android:label="@string/app_name" > ...application>
(2)创建 Application 类,该类继承于 android.app.Application 如: public class CombankDroid extends Application {
private boolean isLogin;}
public boolean isLogin(){
return isLogin}
public void setIsLogin( boolean b){
isLogin isLogin = b;
}
(3)在Activity中使用,通过 Application 类实例,再通过该类中的方法获取相关数据 获取 在Service 和 Activity 中获取 Application 的三种方法: 1> getApplication() : 如 CombankDroid combankDroid = ((CombankDroid)getApplication()) 2> getApplicationContext() : 如 CombankDroid combankDroid = ((CombankDroid)getApplicationContext()) 3> getApplicationInstance() : 如 CombankDroid combankDroid = CombankDroid.getApplicationInstance() 注:getApplicationInstance()用在获取不到context对象的类中 4> 将要操作的属性设为静态方法就可以直接调用 如:MyApplication.info.getUserName() 如: class Anyhow extends Activity {
@Override public void onCreate(Bundle b){
...CombankDroid combankDroid = ((CombankDroid)getApplicationContext());if (!combankDroid.isLogin()) {
redirectToLoginActivity();} else {
loadUi();}...
} ...}
Application中存储数据存在的问题 由于Application 对象不会一直呆着内存里面,它会被kill掉,比如启动 App后将数据存储在Application中点击 Home 键离开App几小时后,再返回App,此时实际上App不会重新启动,Android 系统会创建一个新的Application对象,然后再启动上次用户离开时的Activity以此造成App从来没有被Kill掉的假象,此时在获取Appication中的数据将会出现异常。针对这种问题,可根据情况采用其它的方式:
1> 直接将数据通过intent传递给 Activity 2> 使用官方推荐的几种方式将数据持久化到磁盘上 3> 在使用Application中的数据时,总是要对变量的值进行非空检查 注:对 Application对象有用,对你app里面的单例对象(singleton)或者公共静态变量(public static)同样适用
更多相关文章
- Android 数据存取
- Android 之 使用File类在SD卡中读取数据文件
- android SQLite数据库用法图文详解(附源码)
- [android]数据库SQLiteDatabase简介
- Android数据库应用(《Android开发入门与实战》选摘)
- Android中使用Gson解析JSON数据,以及把JSON数据映射成一个对象
- Storm——Android SQLite数据库管理类库
- Android 监听ContentProvider中数据的变化 Android 监听ContentP
- Android 存储字符串数据到txt文件