在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。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

android内存优化

Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它包括电话本身占用的和...

18970
来自专栏Android开发实战

重新认识Android Context

Context在Android系统中的地位很重要,它几乎无所不能,但它也不是你想用就能随便用的,谨防使用不当引起的内存问题。我们总会忽略掉一些比较细节的东西,自...

12430
来自专栏漏斗社区

天空飘来五字:Android逆向smali

本期,我们将继续Android逆向动态分析之smali篇。内容包括smali语言介绍与动态调试。

13520
来自专栏我就是马云飞

Android MVP升级路(一)乞丐版的自我救赎

引言 记得第一次接触MVP开发是上大学的时候,当时看了数十篇关于MVP的文章,这里不得不吐槽一下国内技术帖子的质量真是参次不齐啊。看完之后一直懵懵懂懂的,总觉有...

26990
来自专栏Android-JessYan

传统MVP用在项目中是真的方便还是累赘?

原文地址: http://www.jianshu.com/p/ac51c9b88af3 qq群:301733278

12710
来自专栏非著名程序员

浅析Otto框架,并与EventBus对比

? 前两天在公众号里发了一篇有关EventBus的文章《玩转EventBus,详解其使用》,有读者和开发者反馈说没有OTTO好用。确实是,各有优缺点吧,那今天...

25950
来自专栏非著名程序员

Android面试系列之应用内多语言切换

昨天组里的同事遇到一些切换多语言的细节问题,发现在Android N版本上配置应用内多语言没有生效,正好拿出来做为一个面试题讲解一下。 面试题:如何实现应用内多...

504100
来自专栏猿湿Xoong

Android 8.0 SystemUI(四):二说顶部 StatusBar

大家好,我是ptt,本篇是 SystemUI 的第四篇,也是 StatusBar 的第二说。

1.4K40
来自专栏图像识别与深度学习

《Android》Lesson02-第1个Project,Log

199120
来自专栏极客猴

你还在使用Dialog?赶紧把DialogFragment用起来

DialogFragment是在Android 3.0的时候被引入的, 目的是dialog也变成了碎片。DialogFragment是Fragment的子类,用...

12330

扫码关注云+社区

领取腾讯云代金券