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