前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Android开发中怎样使用Application类(二)

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

作者头像
1025645
发布2018-08-23 11:26:23
1.5K0
发布2018-08-23 11:26:23
举报
文章被收录于专栏:Android开发小工

Android的奇淫巧技 Application


最近项目太紧,都没时间总结写下自己的开发路上的技术心得了。是时候调整下自己的工作和学习节奏了。

接着上次总结的Application类的实际项目使用Android开发中怎样使用Application类,最近我又发现了一个取巧的使用方法,给想要快速开发的同学分享下心得,也是给大家多提供一个思路吧。

两个使用技巧:

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

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

代码语言:javascript
复制
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类做传入处理了。

代码语言:javascript
复制
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。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.05.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Application中保存Activity的引用,获取当前Activity
  • 2、工具类中用static关键字引入Application实例类的单例对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档