深度挖掘Application,帮你解决项目中的痛点

551 阅读3分钟

        相信很多的小伙伴说起Application的生命周期,也许第一个蹦出来的就是onCreate,在onCreate里面做很多初始化的操作...

        如果你只是知道这个,那么就和本文的作者一样了,是小白中的小白了,下面,让我们一起来学习Application的知识点吧。

Application的属性介绍

android:allowBackup

这个属性设置为true,那么用户可以可以用过adb backupadb restore来进行数据的备份恢复。可能会带来安全风险,一般建议在程序中将此值设置为false。

android:icon / android:roundIcon

这篇文章写得非常不错,对app的图标历史细节进行了介绍,如果你想进入BAT这样的大厂,必须关注细节,它可能是你解决工作中问题一个非常好的习惯。

application中 android:icon 和 android:roundIcon 的区别

android:supportsRtl="true"

项目开发中,我们一般将这个属性设置为false,这样避免从右到左的布局,页面乱了。

下面是这个属性的详细介绍

详细介绍supportsRtl

Application的生命周期

看一下Application中比较重要的方法: 

1、onCreate:应用启动的时候调用。

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

3、onLowMemory:当应用内存不足的情况时,会去调用这个方法。

好的应用程序一般会在这个方法中释放一些不必要的资源来应对内存不足的情况。

4、onConfigurationChanged- 配置改变时触发这个方法,例如手机屏幕旋转等。 

registerActivityLifecycleCallbacks和unregisterActivityLifecycleCallbacks

是什么?

是一个监视者,用来监听Activity的生命周期的改变。

用来解决项目中什么样的问题?

1、获得应用处于前后台的状态

2、通过构造一个ArrayList来获得项目中任务栈中的Activity集合,也可以获得最外层的Activity。

下面是一个监听前后台切换的例子

package example.cdx.com.test;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

public class MyApplication extends Application {

    private boolean isRunInBackground = false;//是否在后台
    private int appCount;

    @Override
    public void onCreate() {
        super.onCreate();
        initBackgroundCallBack();
    }

    private void initBackgroundCallBack() {
        //1、只要app中有一个activity的生命周期改变了就调用registerActivityLifecycleCallbacks方法
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override
            public void onActivityStarted(Activity activity) {
                //当一个页面的onStart执行就会执行onStart,然后appCount+1
                appCount++;
                if (isRunInBackground) {
                    //应用从后台回到前台 需要做的操作
                    back2App(activity);
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {
            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            public void onActivityStopped(Activity activity) {
                //调用onStop方法时appCount就会-1
                appCount--;
                //得到的appCount=0,当所有activity的appCount都=0时,
                //说明所有的activity都在后台,即整个应用都处于后台
                if (appCount == 0) {
                    //应用进入后台 需要做的操作
                    leaveApp(activity);
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

    /**
     * 从后台回到前台需要执行的逻辑
     *
     * @param activity
     */
    private void back2App(Activity activity) {
        isRunInBackground = false;
    }

    /**
     * 离开应用 压入后台或者退出应用
     *
     * @param activity
     */
    private void leaveApp(Activity activity) {
        isRunInBackground = true;
    }

}