欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

活动的最佳实践

程序员文章站 2022-07-13 08:43:00
...

知晓当前是在哪一个活动

当我们入职新的公司的时候,难免要阅读新公司以前开发的旧项目,读了郭神的第一行代码之后发现一个很实用的阅读新项目代码的技巧。就是新建一个baseActivity类,这个baseActivity继承于系统的Activity,并从写onCreate方法,如下图所示。
活动的最佳实践
在onCreate方法中获取了当前实例的类名,并通过Log打印了出来。
接下来把项目里的其它activity继承这个baseActivity,然后我们每打开一个Activity就打印它的类名,如图:这样我们就知道当前是哪个Activity了。
活动的最佳实践


随时随地退出程序

在我们应用的开发过程中,有时候用户打开了多个页面,我们需要退出程序,这时候退出程序需要按多次back键行,但是如果我们添加了activity管理,那么我们就不用这么麻烦,那么现在我来创建一个Activity的管理类:


/**
 * 应用程序Activity管理类:用于Activity管理和应用程序退出
 * 
 */
public class AppManager {

    private static Stack<Activity> activityStack;
    private static AppManager instance;
    private static Activity currentActivity;

    private AppManager() {
    }

    public static AppManager getAppManager() {
        if (instance == null) {
            synchronized (AppManager.class) {
                instance = new AppManager();
            }
        }
        return instance;
    }

    /**
     * 添加Activity到堆栈
     * 
     * @param activity
     */
    public void addActivity(Activity activity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(activity);
    }

    /**
     * 获取当前Activity(堆栈中最后一个压入的)
     * 
     * @return
     */
    public static Activity currentActivity() {
        Activity activity = activityStack.lastElement();
        return activity;
    }

    /**
     * 结束当前Activity(堆栈中最后一个压入的)
     */
    public static void inishActivity() {
        Activity activity = activityStack.lastElement();
        finishActivity(activity);
    }

    /**
     * 结束指定的Activity
     * 
     * @param activity
     */
    public static void finishActivity(Activity activity) {
        if (null != activity) {
            activityStack.remove(activity);
            activity.finish();// 去除解决屏幕旋转的问题
            activity = null;
        }
    }

    /**
     * 结束指定类名的Activity
     *
     */
    public static void finishActivity(Class<?> aClass) {
        if (activityStack == null) {
            return;
        }
        for (Activity activity : activityStack) {
            if (activity.getClass().equals(aClass)) {
                currentActivity = activity;
            }
        }
        finishActivity(currentActivity);
    }

    /**
     * 结束所有Activity
     */
    public static void finishAllActivity() {
        for (int i = 0, size = activityStack.size(); i < size; i++) {
            if (null != activityStack.get(i)) {
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

}

这里我采用了跟郭神不一样的方法,是因为我以前的项目相对复杂,所以设计了这个管理类也相对复杂了些。
这个类的使用可以在BaseActivity中调用addActivity方法添加Activity到这类管理,然后我们退出的时候可以调用finishAllActivity,直接关闭所有Activity,同时我们也可以调用finishActivity结束指定Activity。其它方法的使用,解释基本可以看懂了。

启动活动的最佳写法

当我们从Activity1启动Activity2的时候,有时候可能需要使用Intent传递数据,如下:

Intent intent = new intent(Activity1.this,Activity2.class);
intent.purExtra("param1" , "data1");
intent.purExtra("param2" , "data2");
startActivity(intent);

这样写完全正确的,不管从语法还是规范上,但是在真正的项目开发常会有多个人对接的问题出现。比如Activity2不是你开发的,但是你负责部分需要启动Activity2 的功能,而你却不知道启动这个页面需要传递那些视频数据,这个时候无非有两种方法,一是你自己去阅读Activity2的方法,。二是询问负责Activity2的人。但这些都不是最佳的方法。
最佳的办法是在Activity2添加如下方法:

public Static void actionStart(Context context,String data1 ,String data2){
    Intent intent = new intent(Activity1.this,Activity2.class);
intent.purExtra("param1" , "data1");
intent.purExtra("param2" , "data2");
startActivity(intent);
}

这时候我们只要在Activity1调用actionStart方法传入相应的参数即可。