在Android开发中怎样使用Application类(二)

Android的奇淫巧技 Application

最近项目太紧,都没时间总结写下自己的开发路上的技术心得了。是时候调整下自己的工作和学习节奏了。
接着上次总结的Application类的实际项目使用Android开发中怎样使用Application类,最近我又发现了一个取巧的使用方法,给想要快速开发的同学分享下心得,也是给大家多提供一个思路吧。

两个使用技巧:

1、Application中保存Activity的引用,获取当前Activity

这个不多说,直接上代码,大家就全明白了:

public class App extends Application {

    public static App instance;
    private static final List<Activity> ACTIVITIES = new ArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public App getInstance(){
        return instance;
    }

    public static List<Activity> getActivities() {
        return ACTIVITIES;
    }

    public static void addActivity(Activity activity) {
        if (!ACTIVITIES.contains(activity)) {
            ACTIVITIES.add(activity);
        }
    }

    public static void removeActivity(Activity activity) {
        if (ACTIVITIES.contains(activity)) {
            ACTIVITIES.remove(activity);
        }
    }

    public static void finishNoTopActivity() {
        if (ValidateUtil.isValidate(ACTIVITIES)) {
            while (ACTIVITIES.size() > 1) {
                Activity activity = ACTIVITIES.get(0);
                ACTIVITIES.remove(activity);
                if (activity != null && !activity.isFinishing()) {
                    activity.finish();
                }
            }
        }

    }

    public static void finishAllActivity() {
        while (ValidateUtil.isValidate(ACTIVITIES)) {
            Activity activity = ACTIVITIES.get(0);
            ACTIVITIES.remove(activity);
            if (activity != null && !activity.isFinishing()) {
                activity.finish();
            }
        }
    }

    public static Activity getCurrentActivity() {
        if (ValidateUtil.isValidate(ACTIVITIES)) {
            return ACTIVITIES.get(ACTIVITIES.size() - 1);
        }
        return null;
    }
}

这里只是演示下方法,倒是没太大的用处,但是如果你要写一个Dialog显示的帮助类,统一全局的Dialog样式,你就可以在这个帮助类中获取App的当前Activity实例来显示Dialog.

2、工具类中用static关键字引入Application实例类的单例对象

这个才是今天我主要想说的,在import中通过static关键字引入Application实例,工具类和帮助类中的大量方法中就不用大量依赖Context类做传入处理了。

import android.content.Context;
import android.content.res.Resources;
import com.cq.dome.utils.helper.ResHelper;
import static com.cq.dome.App.instance;

public class PixelUtil {
    //static引用App类的方法,对比下面的方法
    public static float dp2px(float value) {
        final float scale = instance.getResources().getDisplayMetrics().densityDpi;
        return value * scale / 160 + 0.5f;
    }
    //依赖Context类传入的方法
    public static float dp2px(float value, Context context) {
        final float scale = context.getResources().getDisplayMetrics().densityDpi;
        return value * scale / 160 + 0.5f;
    }
    
    public static int px2sp(float value) {
        final float scale = instance.getResources().getDisplayMetrics().scaledDensity;
        return (int) ((value - 0.5) / scale);
    }

    public static int px2sp(float value, Context context) {
        final float scale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (value / scale + 0.5f);
    }
}

结合上一个用法,你在任何的类中都可以获取当前的栈顶的Activity去做显示操作(显示Dialog等),也可以获取全局的Application实例来做很多骚操作。第二种方法当然在设计模式上有耦合度很高的缺点,导致这些工具类都要依赖App类,但是在Android开发中,这个你可以封装一个BaseApplication的Application的基础类来,让其他的Application类继承他,也就是子类来作为应用的Appliance。

由于笔者感觉理论上完全可以,而且是真的方便,但是毕竟我也还是用这个思路在试用阶段,没有经过大量的项目实践检验,所有大家如果用这种方法遇到坑请给我留言注意一下。

    原文作者:蝉翅的空响
    原文地址: https://www.jianshu.com/p/76e8f8f409e9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞