什么是Android  Application?
简单来说,一个apk文件就是一个Application。
    任何一个Android Application基本上是由一些Activities组成,当用户与应用程序交互时其所包含的部分Activities具有紧密的逻辑关系,或者各自独立处理不同的响应。
    这些Activities捆绑在一起成为了一个处理特定需求的Application, 并且以“。apk”作为后缀名存在于文件系统中。
    Android平台默认下的应用程序 例如:Email、Calendar、Browser、Maps、Text Message、Contacts、Camera和Dialer等都是一个个独立的Apps。
    安装 Application的过程也可以简单理解为将其所包裹的Activities导入到当前的系统中,如果系统中已经存在了相同的Activities, 那么将会自动将其关联,而不会重复安装相同的Activities,避免资源的浪费。
    Application卸载的过程也会检查当前所关联的 Activities是否有被其它Application标签所关联,如果仅仅是提供当前的Application使用,那么将会彻底被移除,相反则不做 任何操作。
    就像我们已经知道的,Application基本上是由四个模块组成:Activity、Service、Content Provider 和 Broadcast Receiver,其中Activity是实现应用的主体。
    什么是 Activity Stack?
    操作应用程序时,有时需要调用多个Activities来完成需求,例如:发送邮件程序,首先是进入邮件主界面,然后启动一个新的Activity用于填写新邮件内容,同时可以调出联系人列表用于插入收件人信息等等。在这个操作过程中 Android平台有一个专门用于管理Activities堆栈的机制,其可以方便的线性记录Activities实例,当完成某个操作时,可以通过导航功能返回之前的Activity(通过按操作台的“Back”按钮)。
    每次启动新的Activity都将被添加到Activity Stack。用户可以方便的返回上一个Activity直到Home Screen,到达Home Screen后,将无法再继续查看堆栈记录(俗话说:到头了)。如果当前Task被中止(Interrupting the task),返回到系统主界面后启动了其它操作,当希望返回到前一个Task继续执行时,只需要再次通过主界面的Application launcher或者快捷方式启动这个Task的Root Activity便可返回其中止时的状态继续执行。
    相对于Views、Windows、Menus和Dialogs而言,Activity是唯一可被记录在History stack中的数据,所以当你所设计的应用程序需要用户由A界面进入到次一级界面B,当完成操作后需要再次返回A,那么必须考虑将A看作为 Activity,否则将无法从历史堆栈中返回。
    什么是Task
    当我们需要一个Activity可以启动另一个Activity,可能另外一个Activity是定义在不同应用程序中的Activity。
    例如,假设你想在你的应用中让用户显示一些地方的街景。而这里已经有一个Activity可以做到这一点,因此,你的Activity所需要做的只是在Intent对象中添加必要的信息,并传递给startActivity()。地图浏览将会显示你的地图。当用户按下BACK键,你的Activity会再次出现在屏幕上。
    对于用户来说,看起来好像是地图浏览与你的Activity一样,属于相同的应用程序,即便是它定义在其它的应用程序里,并运行在那个应用程序的进程里。
    Android通过将这两个Activity保存在同一个Task里来体现这一用户体验。简单来说,一个Task就是用户体验上的一个“应用”。
    它将相关的Activity组合在一起,以stack的方式管理(就是前面提到的Activity Stack),这就是Task。
    在Android平台上可以将task简单的理解为幽多个Activity共同协作完成某项应用,而不管Activity具体属于哪个Application,
    通过下图可以更清晰的理解Application、task、Activity三者之间的关系:

Task 有啥用?
    我们用过Android的手机就会知道有下面的场景:
    假设我们首先在用IReader在看书,从选书到具体书的阅读界面,这是有好几个Activity。我们每一个点击的Activity都被放在阅读这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。
    我们在阅读到一半时,想看看Sina微博,按Home键离开了IReader。
    在Sina微博界面也是有多个Activity,我们一步到阅读界面。这时候我们每一个点击的Activity都被放在Sina微博这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。
    我们这时候再回到IReader读书界面,原先的状态还是保留的。
    显然每一个Task有自己的 Activity Stack。
    Task就是这样为了方便人们使用手机而设置的,就像前面提到的场景Task可以跨Application。
    下面这个图从另外一个角度描述了Application Task Activities的关系

Task通过Application launcher、Home screen的快捷方式或者 由 “Recent Tasks”(长时间按住Home键)最近使用过的Task记录中启动。
    当从一个Activity中启动另外一个Activity时,Back键将作用于返回前一个Activity,与此同时 新开启的Activity将被添加到Activity Stack中。

Application 配置全局Context

第一步、写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application

第二步、配置全局的Context

<application android:name="com.appstore.service.MyApplication" ></application>

第三步、使用,使用的时候用的时候根据类的名称访问Context

Android程序的入口点

Android使用Google Dalvik VM,相对于传统Java VM而言有着很大的不同,在Sun的Java体系中入口点和标准c语言一样是main(),而每个Android程序都包含着一个Application实例,一个Application实例中有多个Activity、Service、ContentProvider或Broadcast Receiver。因为大部分的应用都包含Activity所以,说很多网友认为是Activity的onCreate,但是你没有发现你的工程中有多个Activity吗? 你可能没有见过没有Activity的Android应用吧。

其实在android.app.Application这个包的onCreate才是真正的Android入口点,只不过大多数开发者无需重写该类,他的继承关系如下图:

java.lang.Object
--android.content.Context
----android.content.ContextWrapper
-----android.app.Application

android.app.Application类包含了4个公开的方法

void  onConfigurationChanged(Configuration newConfig)
void  onCreate()  //这里才是真正的入口点。
void  onLowMemory()
void  onTerminate()

说明:
      onCreate();  这个函数是当我们的应用开始之时就被调用了,比应用中的其他对象创建的早,这个实现尽可能的快一点,因为这个时间直接影响到我们第一个activity/service/receiver。如果你要重写这个方法必须调用super.onCreate().
      onTerminate(): 这个函数是模拟一个过程环境,在真机中永远也不会被调用。

所以希望大家,记住真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了,并不是每个应用都必须有Activity的。

Android中application 关于全局变量

android编程中,application这样的名词似乎变得那样的不常见,而让大家更为熟悉的是activity、intent、provider、broadcast和service。但其实android中的application也有着它自身的用处。

打开manifest文件,会看到有一个application配置标签,这就是有关application的使用了。那究竟application有什么用处呢?来看看SDK中是如何描述的:

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是用来保存全局变量的,并且是在package创建的时候就跟着存在了。所以当我们需要创建全局变量的时候,不需要再像 j2se那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个application对象,再做出相应的处理。

因小工程中涉及到的文件比较多,这里就贴代码撒。

application文件:

[html]  view plain copy
  1. public class TestApplication extends Application {
  2. private int curIndex;
  3. public int getCurIndex() {
  4. return curIndex;
  5. }
  6. public void setCurIndex(int curIndex) {
  7. this.curIndex = curIndex;
  8. }
  9. @Override
  10. public void onCreate() {
  11. super.onCreate();
  12. }
  13. @Override
  14. public void onTerminate() {
  15. super.onTerminate();
  16. }
  17. }

application中有一个curIndex和setter getter方法。

第一个acitivty中对application进行的操作:

[html]  view plain copy
  1. TestApplication application = (TestApplication) this.getApplication();
  2. Log.i("data", ""+application.getCurIndex());
  3. application.setCurIndex(5);

第二个Activity:

[html]  view plain copy
  1. TestApplication application = (TestApplication)this.getApplication();
  2. Log.i("data", ""+application.getCurIndex());
  3. application.setCurIndex(6);

第三个Activity:

[html]  view plain copy
  1. final TestApplication application = (TestApplication) this.getApplication();
  2. Log.i("data", ""+application.getCurIndex());

在运行过程中,每一次都kill掉对应的Activity,再进入下一个Activity。

Android Application解析相关推荐

  1. android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...

    在我的Android Application的服务器端应用程序也由我开发.在这个应用程序Android应用程序从服务器请求一些XML并解析它. XML包含描述应用程序中应该有多少标签的信息,并且每个标 ...

  2. Android application 中使用 provided aar 并没有那么简单

    前言 首先简单讲一下这个需求的背景,大部分场景下,是没有这个需求的,这个需求出现在插件化中,当一个android插件引用aar中的类的时候,并且这个插件是使用com.android.applicati ...

  3. Android IntentService解析

    Android IntentService解析 在开发安卓应用程序时,除非你指定,否则绝大部分执行动作都运行UI线程中.这种机制会引发一些问题,因为耗时操作会妨碍用户交互行为.这会让用户感到懊恼,甚至 ...

  4. Android如何解析Intent

    在应用中,我们可以以两种形式来使用Intent: 直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Cont ...

  5. Android XML解析器– XMLPullParser

    Welcome to android xml parser example using XMLPullParser. We will have a sample XML file that we wi ...

  6. Android application 和 activity 标签详解

    Application 标签 android:allowTaskReparenting android:allowTaskReparenting=["true" | "f ...

  7. Android MultiDex 解析与使用

    Android MultiDex 解析与使用 背景 随着你的Apk不断的迭代更新,到你的apk到达一定大小的时候,你在编译apk的时候可能会出现下面的错误: Conversion to Dalvik ...

  8. Android应用解析包错误原因的总结(不定时更新)

    Android应用解析包错误的原因 导致这个问题的原因目前就我所知道的而言大致有三种(其他原因请看文章末尾): 一.使用v1.v2方式签名带来的问题 二.Android7.0新特性导致的原因 三.应用 ...

  9. Android全面解析之Context机制

    文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章. 在文章Android全面解析之由浅及深Handler消息机制中讨论到,Handler可以: 避免我们自己去手动写 死循环和输入阻 ...

最新文章

  1. 在pycharm中安装第三方库
  2. 二维平面内无人机的路径规划——势场法-改进
  3. 使用 JavaScript 实现灵活的固定导航功能
  4. session-cookie 和token登录验证
  5. JDBC连接Oracle数据库的参数配置
  6. opencv(二) 图片处理
  7. leetcode 1239. 串联字符串的最大长度
  8. 11.04.30 半夜清晨
  9. nginx中配置angular项目_强大,Nginx配置一键生成
  10. 靠信用购物!芝麻信用上线新功能:用户可先用后买
  11. echo 多行_分享laravel-echo-server广播服务搭建-Laravel
  12. zabbix自动同步ldap帐号到数据库
  13. 如何在秋招中拿到offer?
  14. 手把手学习和理解遗传算法的最佳例子
  15. 微信小程序真机预览图片图标无法显示
  16. 蚂蚁金服副 CTO胡喜:从 BASIC 到 basic ,蚂蚁金服十五年技术架构演进之路
  17. Git教程之如何版本回退
  18. python使用while循环语句计算GDP
  19. 浅谈kafka之partition
  20. 埃林哲一面面试经历(记录第一次面试)

热门文章

  1. 架构系列---消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统
  2. python多大的孩子_少儿python教材适合多大的孩子?孩子接触起来困难吗?
  3. 不同情windows奴隶
  4. 怎么编辑被保护的word文件
  5. 菏泽学院春季高考计算机投档饯,2018山东春季高考本科普通批一志愿院校投档情况统计表...
  6. 输出100以内素数,思想,代码
  7. Linux elementary-ubuntu 使用笔记
  8. 计算机系统结构知识点总结
  9. 【C语言】让你不再因为指针而感到头疼
  10. linux centos7中unzip解压zip时中文乱码的解决办法