Android Application介绍

一、先看看文档里怎么说

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 <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created.

  Application 类是用来维护应用程序全局状态。你可以提供自己的实现,并在 AndroidManifest.xml文件的 <application> 标签中指出他的名字,这将导致在创建应用程序时去实例化你自己的 Application 类。

  Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (Singleton)模式的一个类。且 Application 对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局唯一的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过 Application 来进行一些:数据传递、数据共享、数据缓存等操作。

二、重写 Application 类的生命周期事件

public  void  onCreate()

   在应用程序创建的时候被调用,可以实现这个这个方法来创建和实例化任何应用程序状态变量或共享资源。还可以在这个方法里面得到 Application 的单例。

  public void onTerminate ()

  当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程。

  public  void onLowMemory()

  当系统资源匮乏的时候,我们可以在这里可以释放额外的内存, 这个方法一般只会在后台进程已经结束,但前台应用程序还是缺少内存时调用。可以重写这个方法来清空缓存或者释放不必要的资源。

  public  void  onTrimMemory(int level)

  当运行时决定当前应用程序应该减少其内存开销时(通常在进入后台运行的时候)调用,包含一个 level 参数,用于提供请求的上下文。

  public void onConfigurationChanged (Configuration newConfig)

  与 Activity 不同,配置改变时,应用程序对象不会被终止和重启。如果应用程序使用的值依赖于特定的配置,则重写这个方法来加载这些值,或者在应用程序级处理配置值的改变。

三、通过 Application 传递数据

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

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

四、Application 数据缓存

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

  1、首先创建MyApplication去继承Application类 

public class MyApplication extends Application {
private static MyApplication singleton;
private String test;
public static MyApplication getInstance(){
return singleton;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
} @Override
public final void onCreate() {
super.onCreate();
singleton = this;
}
}

  2、在MainActivity中获取MyApplication的实例化对象,并且改变MyApplication中test变量的值。

public class MainActivity extends Activity {
private MyApplication myApp;
EditText etTest;
Button bnGo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myApp = MyApplication.getInstance();//获取Application类实例化对象
etTest = (EditText)findViewById(R.id.et_test);//绑定控件
bnGo = (Button)findViewById(R.id.bn_go);//绑定控件
bnGo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
myApp.setTest(etTest.getText().toString());//改变MyApplication中test变量的值
Intent intent = new Intent(MainActivity.this, TestActivity.class);
startActivity(intent);
}
});
}
}

  3、在TestActivity取出MyApplication中的test值并显示在TextView上

public class TestActivity extends Activity {
private String test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
TextView tvShow = (TextView)findViewById(R.id.tv_show);
test = MyApplication.getInstance().getTest();
tvShow.setText(test);
}
}

  效果:

              

android开发--Application的更多相关文章

  1. Android 开发笔记“Application 理解”

    Android 中Application类用法 1.             Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...

  2. android &lt;application&gt; 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客仅仅要没有注明"转",那么均为原创.转贴请注明本博客链接链接 <application>语法:    <appl ...

  3. Android开发(二十六)——Application

    application package com.lgaoxiao.application; import java.util.LinkedList; import java.util.List; im ...

  4. Android开发(二十三)——Application

    参考: [1] Android中Application类用法.http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.htm ...

  5. Android开发之基于AndroidStudio环境搭建和工程创建

    断断续续的学习安卓也有一段时间了.因为之前是搞iOS开发的, 之前有关iOS的博客请看<我的iOS开发系列博文>.<我的Objective-C系列文章>和<窥探Swift ...

  6. Android 开发环境搭建以及工具(不断更新)

    学习android需要学习的编程知识 https://wiki.cyanogenmod.org/w/Doc:_Development_Resources 从http://source.android. ...

  7. Android开发用过的十大框架

    http://blog.csdn.net/u011200604/article/details/51695096 本文系多方综合与转载整合,意在Android开发中能够知道和使用一些好用的第三方支持, ...

  8. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  9. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

随机推荐

  1. 开发时建议关闭chrome的缓存[Disable cache(while DevTools open)]

    问题:修改了css,JS后,chrome看不到效果 具体情景:最近在写一个PHPbbs,在写CSS时,习惯性的按F5刷新,firefox ie等,都能即时见到效果,唯独chrome 怎么都不行,想了想 ...

  2. 线程安全及Python中的GIL

    线程安全及Python中的GIL 本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 订阅 来订阅本博客. ...

  3. web编程

    展示层 html/css/javascript/jquery/jquery easyUI/ajax bootstrap web层 varnish/haproxy/squid----lvs/keepal ...

  4. [MySql] - 数据库备份还原

    导出数据库到SQL方法: mysqldump.exe -u[USERNAME] -p[PASSWORD] -h [IP] jira --lock-all-tables > c:\db.sql m ...

  5. JMeter Webservice测试计划

    一.新建测试计划:HelloWorld测试计划 二.添加线程组 编辑线程组属性: 三.添加 SOAP/ XML-RPC 请求元素 四.填入url地址及请求报文 此处的请求报文,是用soapUI生成的, ...

  6. PetShop安装失败

    报错提示: Security This installer has encountered an unexpected error installing this package. This may ...

  7. makefile函数

    http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...

  8. python(28)获得网卡的IP地址

    获得第几块网卡的ip地址: def get_ip_address(self,ifname): # ifname = 'eth0' s = socket.socket(socket.AF_INET, s ...

  9. 在sql脚本中获取变量中的查询结果

    )--变量 ) set @itemValue='select @a=getdate()'--赋值 exec sp_executesql @itemValue,N'@a nvarchar(max) ou ...

  10. UIButton的titleLabe setAttributeSting 首次不起作用

    环境xcode7.3 ios9.3 真机模拟器均出现 UIButton的titleLabe setAttributeSting 首次不起作用,之后每一次 都正常,百思不得解,无奈之下改变策略,讲but ...