首页 > 其他分享 >Application总结

Application总结

时间:2022-12-01 15:02:25浏览次数:46  
标签:总结 name application Application MyApplication MyApp Activity


通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。


当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。

假如有一个Activity A, 跳转到 Activity B ,并需要推荐一些数据,通常的作法是Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。但这样作有一个问题在 于,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个 进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。

基本思路是这样的。在Application中创建一个HashMap<String,Object> ,以字符串为索引,Object为value这样我们的HashMap就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个HashMap,然后通过Intent或者其它途经再把这人索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。只要再向下转个型 ,就实现了对象的传递。

我一般会习惯在application中建立两个HashMap<String,Object>一个用于数据的传递,一个用于缓 存一些数据。比如有一个Activity需要从网站获取一些数据,获取完之后我们就可以把这个数据cache到Application 当中,当页面设置到其它Activity再回来的时候,就可以直接使用缓存好的数据了。但如果需要cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网 络上获取。


记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏。


<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:name=".MyApplication">

这里定义了我们整个应用程序的属性,例如名称和图标。

我们可以自定义Appliction,例如:

public class MyApplication extends Application {
}

就是这儿,将我们以前一直用的默认Application给他设置成我们自己做的MyApplication
MyApplication类的作用是为了放一些全局的和一些上下文都要用到变量和方法之类的。

   1:定义一个类去继承系统的Application

 

     public class MyApplication extends Application

 

    在onCreat中做一些初始化工作,设置全局中要使用到的成员变量【一般都会设置对应的get和set方法】

 

  2:在AndroidManifest.xml中进行配置

 

      在 application节点:

 

      <application

        android:name="******.MyApplication"    //类的全路径即完整的包名+类名

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >

 

3:在需要的地方直接使用【Activity、Service等】

 

     MyApplication  application;

     application = (MyApplication) getApplication();  //将当前的上下文拆箱转为我们自定义的application

 

    这个时候我们就可以使用MyApplication中我们定义的属性了 

 

   例如在service我们不断的去定位,此时的location我们既需要最新的数据同时其它的组件要能及时获取最新的location,我们在sevice中 application.setLastLocation(l);,通过这句话我们设置好了一个全局的location,每当location定位变化的时候,都会重新设置该值。在其它组件,我们通过application.getLastLocaton()即可获取了

测试示例: 1.创建自定义的application类:

packagecom.example.context;
02. importandroid.app.Application;
03. importandroid.util.Log;
04. /**
05. * @author Rowand jj
06. *
07. *整个应用的上下文对象
08. */
09. publicclass MyApp extendsApplication
10. {
11. privatestatic final MyApp instance = new MyApp();
12.
13. /**
14. * 全局变量
15. */
16. privateString name = "Rowandjj";
17.
18. /*
19. * android应用程序真正入口。
20. * 此方法在所有activity,servie,receiver组件之前调用
21. * */
22. @Override
23. publicvoid onCreate()
24. {
25. super.onCreate();//必须调用父类方法
26. Log.i("CREATE","application created....");
27. }
28.
29.
30. /**
31. * 此方法方便在那些没有context对象的类中使用
32. * @return MyApp实例
33. */
34. publicstatic MyApp getApplicationInstance()
35. {
36. returninstance;
37. }
38.
39. /* setter/getter 方法 */
40. publicString getName()
41. {
42. returnname;
43. }
44. publicvoid setName(String name)
45. {
46. this.name = name;
47. }
48.
49. }

2.清单文件中配置此application(直接在application节点中增加一个name属性即可)

前面写了(到前面看)
3.使用application中存储的全局变量

packagecom.example.applicationdemo;
02. importandroid.app.Activity;
03. importandroid.os.Bundle;
04. importandroid.util.Log;
05. importcom.example.context.MyApp;
06. publicclass MainActivity extendsActivity
07. {
08. privatestatic final String TAG = "MainActivity";
09. @Override
10. protectedvoid onCreate(Bundle savedInstanceState)
11. {
12. super.onCreate(savedInstanceState);
13. setContentView(R.layout.activity_main);
14. Log.i("CREATE","activity created...");
15. MyApp app1 = (MyApp)this.getApplication();
16. Log.i(TAG,"方式一:"+app1.getName());
17.
18. MyApp app2 = (MyApp)this.getApplicationContext();
19. Log.i(TAG,"方式二:"+app2.getName());
20.
21. MyApp app3 = MyApp.getApplicationInstance();//用在获取不到context对象的类中
22. Log.i(TAG,"方式三:"+app3.getName());
23.
24. }
25. }

标签:总结,name,application,Application,MyApplication,MyApp,Activity
From: https://blog.51cto.com/u_15898516/5901925

相关文章

  • Intelij idea 2022.2.3安装过程总结
    参考教程:https://www.exception.site/essay/idea-reset-eval详细安装过程参考了以上教程,本文对博主自己安装时遇到的问题进行总结。1.安装过程概述安装过程参考教程,一直......
  • 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内
    承接上文之前文章根据《【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)》我们知道了如何进行设......
  • 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内
    背景介绍在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是......
  • 反悔贪心总结
    综合题:AGC018CCoins大致可以分为两种类型,即要求全选或者有的可以不选。第一类:要求全选问题简述:给定\(x+y\)个物品,每个物品有\(a_i\),\(b_i\)两种属性,要求取......
  • 2013总结
     前天经过毕业后来深圳居住的地方,同样的街道,同样的吵杂,同样的热火朝天,一切都似乎在昨天,但是人的心境已然变换,脑海中的那些人仍然是年轻时的样子,脑海中的那些快乐的事仍然......
  • .Net【Winform】BackgroudWorker总结
    BackgroundWorkerWinfrom程序经常会有一些后台耗时操作,例如批量处理,如果在主UI线程上执行,UI线程会卡死,用户的使用感觉会很差。而BackgroundWorker提供了执行异步操作,配合......
  • 继承--总结
    继承特点子类默认拥有父类的所有属性和方法子类重写父类同名方法和属性子类调用父类同名方法和属性super()方法快速调用父类方法私有权限不能继承给子......
  • Numpy库常用函数总结
    引言:Numpy是科学计算库,是一个强大的N维数组对象Ndarray,计算功能是数组的50倍,具有广播机制。其包含的数学函数极大地方便了数据计算与研究,也是pandas和Scipy的基础.impo......
  • Reack hooks useEffect 总结
    useEffect总结特性参数必须是一个回调函数与一个数组组件首次加载会执行一次useEffect的回调,之后依赖的值更新则会执行useEffect中的回调。如果第二个参数是一个空数......
  • Git相关操作总结
    1.查看仓库信息gitremote-v2.初始化git仓库gitinit3.添加远程仓库地址gitremoteaddorigin仓库地址4.从远程仓库克隆下载代码gitclone-b分支名称远程......