博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Application与Activity
阅读量:5916 次
发布时间:2019-06-19

本文共 2601 字,大约阅读时间需要 8 分钟。

hot3.png

Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。打开每一个应用程 序的manifest文件,可以看到activity都是包含在application标签之中,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

    <application

        android:label="ViewPagerIndicator Sample"

        android:icon="@drawable/icon">

        <activity

            android:name=".ListSamples"

            android:label="ViewPager Indicator">

            <intent-filter>

                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>

            </intent-filter>

        </activity>

.......

......

......

android 系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用 Application。

为了更好的利用Application的这一特性,比如我们需要Application来保存一些静态值,需要自 定义继承于Application的类,然后在这个类中定义一个变量来保存。在默认情况下应用系统会自动生成Application 对象,但是如果我们自定义了Application,那就需要告知系统,实例化的时候,是实例化我们自定义的,而非默认的。比如我们自定义了一个 AppContext类:

1

2

3

4

5

6

7

8

public class AppContext extends Application {

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

    public static final int NETTYPE_WIFI = 0x01;

    public static final int NETTYPE_CMWAP = 0x02;

    public static final int NETTYPE_CMNET = 0x03;

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

    public static final int PAGE_SIZE = 20;//默认分页大小

    private static final int CACHE_TIME = 10*60000;//缓存失效时间

为了让系统实例化的时候找到,我们必须在manifest中修改application标签属性:

1

2

3

4

5

<application

    android:name=".AppContext"

    android:icon="@drawable/ic_launcher"

    android:label="@string/app_name"

    android:theme="@style/AppTheme">

关键的是这句:android:name=".AppContext"

通常Application全局对象是通过Context或者Activity的getApplicationContext()方法获得的比如我们在应用程序中想要获得我们刚刚定义的AppContext对象,就需要在activity中这样做:

appContext = (AppContext)this.getApplicationContext();

如果有Context对象,还可以:appContext = (AppContext)mContext.getApplicationContext();

但是很多时候我们的代码可能在activity之外,且没有context对象的引用,但是又需要获得AppContext对象,原始的做法可能是想办法将activity或者context传递到需要调用的地方,但是这样代码耦合度太高,可读性差。我们有更优雅的做法。

我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没有,我们只能在自定义的时候想办法。

Application是系统的一个组件,也就有自己的生命周期函数,让人感到意外的是他的生命周期函数中居然也有onCreate(),onCreate是被自动调用的,我们可以利用这点来获得这个Application对象。

在AppContext中加入如下几行代码:

1

2

3

4

5

6

7

8

9

10

private static AppContext instance;

public static AppContext getInstance() {

    returninstance;

}

@Override

public void onCreate() {

    // TODO Auto-generated method stub

    super.onCreate();

    instance =this;

}

这样我们就能在app工程的任何地方通过AppContext.getInstance()来获得Application全局对象。比如我定义了一个工具类,在工具内中我们需要使用

Context的getExternalFilesDir()方法。但是这个工具类没有直接的办法获取到context,于是我们可以:

1

returnAppContext.getInstance().getExternalFilesDir(null);

转载于:https://my.oschina.net/oschenxiaomo/blog/550202

你可能感兴趣的文章
CentOS 6 下RPM方式安装MySQL5.6
查看>>
三种 Failover 之 Client-Side Connect time Failover、Client-Side TAF、Service-Side TAF
查看>>
css样式初始化
查看>>
51Nod-1002 数塔取数问题【DP】
查看>>
UVA129 HDU1627 Krypton Factor
查看>>
孙子算经 卷下
查看>>
我的第一个WinForm程序
查看>>
完美分页存储过程(有缺陷,无法加入条件)
查看>>
Spark Streaming实时计算框架介绍
查看>>
oracle主键自增
查看>>
PHP入门part2
查看>>
hexo如何添加自定义站内搜索
查看>>
微信公众号开发Django-网页授权
查看>>
ARM TK1 安装ROS- indigo
查看>>
【LeetCode】198 - House Robber
查看>>
springboot~集成测试里的redis
查看>>
爱上MVC~Razor引擎时,在遍历中巧用Output.Write方法
查看>>
字符串操作、文件操作,英文词频统计预处理
查看>>
access中关于日期的转换
查看>>
关于页面刷新的问题
查看>>