Application少为人知的用法

本文介绍如何利用Android的Application类来监听应用中所有Activity的生命周期、手机内存占用情况及屏幕方向变化,并提供判断应用是否处于主进程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平常我们都是在onCreate初始化一些应用程序级的对象或配置,但是这还是Application众多用法的其中之一。
 

1.监听所有activity的生命周期

 

在onCreate函数里通过注册接口来实现

 

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v(TAG_ONE,"onCreate");

        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.v(TAG_ONE,"onActivityCreated");
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.v(TAG_ONE,"onActivityStarted");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.v(TAG_ONE,"onActivityResumed");
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.v(TAG_ONE,"onActivityPaused");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.v(TAG_ONE,"onActivityStopped");
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
                Log.v(TAG_ONE,"onActivitySaveInstanceState");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.v(TAG_ONE,"onActivityDestroyed");
            }
        });
    }

(1)我们可以判断当前应用是否处于前台,如果比如我在onActivityResumed 给一个变量 加 1,在onActivityStopped里减 1 ,如果这个变量大于0则应用处于前台,否则处于后台。

(2)统计有多少个activity存活,

 

 

 

 

2.监听手机内存占用,屏幕方向,低内存状况

 


同样是在onCreate里注册接口

        registerComponentCallbacks(new ComponentCallbacks2() {
            @Override
            public void onTrimMemory(int level) {
                Log.v(TAG_TWO,"onTrimMemory"+level);
            }

            @Override
            public void onConfigurationChanged(Configuration newConfig) {
                Log.v(TAG_TWO,"onConfigurationChanged"+newConfig.orientation);
            }

            @Override
            public void onLowMemory() {
                Log.v(TAG_TWO,"onLowMemory");
            }
        });

 

这里要提一句,这个接口的三个函数,我们都可以在Activity,Service里实现

onConfigurationChanged:可以监听屏幕方向变换

onLowMemory:当手机内存紧张时会触发这个函数,提醒应用释放一些资源来保证应用的存活。

onTrimMemory:监听内存等级,我应用一启动,这个就会说当前内存等级为80,也就是后台进程最危险的时候,我想想也是,当时程序只是创建了Application,Activity还在创建之中还没有显示;当我点击home键,使应用编程后台程序,说内存等级为20,就是前台程序变后台程序,我们可以在这个函数里释放一些UI资源,比如

内存等级说明如下图

 

 

3.判断是否是主进程

这个不是用法,而是使用application需要注意的,在我们开启多进程时,我们自定义的Application会多初始化一次,为了防止浪费资源,所以需要判断是否是主进程

public class App extends Application {


    /**
     * 是否为主线程
     */
    private boolean isMainThread = Looper.getMainLooper() == Looper.myLooper();

    /**
     * 是否为主进程
     */
    private boolean isMainProcess ;

    @Override
    public void onCreate() {
        super.onCreate();
        isMainProcess = getApplicationContext().getPackageName().equals
                (getCurrentProcessName());
        Log.e("song", "是否为主线程" + isMainThread);
        Log.e("song", "是否为主进程" + isMainProcess);

    }
    /**
     * 获取当前进程名
     */
    private String getCurrentProcessName() {
        int pid = android.os.Process.myPid();
        String processName = "";
        ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService
                (Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {
            if (process.pid == pid) {
                processName = process.processName;
            }
        }
        return processName;
    }

}

 

 

参考文章:

https://www.jianshu.com/p/f665366b2a47

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值