安卓市场--框架搭建2

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46924921 在上一篇中,我们回顾了android的activity的生命周期以及Application的基本知识,在这一篇中,我们正式开始我们的项目之旅。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46924921

在上一篇中,我们回顾了android的activity的生命周期以及Application的基本知识,在这一篇中,我们正式开始我们的项目之旅。

在我们进行项目开发的时候,首先需要做的就是搭建一个项目框架,由于我也没有正式的去公司工作过,仅仅就是按照自己的理解来搭建一个小型的项目框架,我们先来完成第一步。

在我们的任何一个android程序中,都需要一个对activity进行管理的类,我们现在称作AppManager,既然该类是对activity进行管理的,我们就需要记录每一个activity,按照我们在进行activity操作的时候,每一个activity进出的原则是后进先出的,所以,我们需要有一个堆栈,来保存activity的引用,同时,我们的管理类在整个项目中,只需要一个实例即可,所以,我们就需要使用单例模式来创建一个AppManager的实例。

既然activity需要和AppManager进行交互,所以,我们需要建立一个统一的BaseActivity实现这些功能,其他的Activity都继承自BaseActivity即可,好了 ,思路咱们有了,我们现在就着手开发一下这两个类的实现。

首先我们先构建AppManager类。

首先,根据单例模式,我们需要根据单例模式的规则,指定该类的构造函数,同时,实现一个
getAppManager()函数来获取唯一一个AppManager实体。

现在我们来看一下代码;


    private static AppManager instance;

    private AppManager() {

    }

    /**
     * 单实例 , UI无需考虑多线程同步问题
     */
    public static AppManager getAppManager() {
        if (instance == null) {
            instance = new AppManager();
        }
        return instance;
    }

这样的话,就能够创建了我们的AppManager的单例了。

下一步,我们需要创建一个堆栈,来保存Activity引用。同时创建一些对这些activity管理的函数。

我们来看一下,这些都比较简单:

     private static Stack<BaseActivity> activityStack;

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

    /**
     * 获取当前Activity(栈顶Activity)
     */
    public BaseActivity currentActivity() {
        if (activityStack == null || activityStack.isEmpty()) {
            return null;
        }
        BaseActivity activity = activityStack.lastElement();
        return activity;
    }

    /**
     * 获取当前Activity(栈顶Activity) 没有找到则返回null
     */
    public BaseActivity findActivity(Class<?> cls) {
        BaseActivity activity = null;
        for (BaseActivity aty : activityStack) {
            if (aty.getClass().equals(cls)) {
                activity = aty;
                break;
            }
        }
        return activity;
    }

    /**
     * 结束当前Activity(栈顶Activity)
     */
    public void finishActivity() {
        BaseActivity activity = activityStack.lastElement();
        finishActivity(activity);
    }

    /**
     * 结束指定的Activity(重载)
     */
    public void finishActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 结束指定的Activity(重载)
     */
    public void finishActivity(Class<?> cls) {
        for (BaseActivity activity : activityStack) {
            if (activity.getClass().equals(cls)) {
                finishActivity(activity);
            }
        }
    }

    /**
     * 关闭除了指定activity以外的全部activity 如果cls不存在于栈中,则栈全部清空
     * 
     * @param cls
     */
    public void finishOthersActivity(Class<?> cls) {
        for (BaseActivity activity : activityStack) {
            if (!(activity.getClass().equals(cls))) {
                finishActivity(activity);
            }
        }
    }

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

    /**
     * 应用程序退出
     */
    public void AppExit(Context context) {
        try {
            finishAllActivity();
            ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.killBackgroundProcesses(context.getPackageName());
            System.exit(0);
        } catch (Exception e) {
            System.exit(0);
        }
    }

这样的话,我们的这个AppManager类基本上就已经实现了,现在我们来看一下这个完整的代码:


    package com.sdu.manager;

    import java.util.Stack;

    import com.sdu.activities.BaseActivity;

    import android.app.Activity;
    import android.app.ActivityManager;
    import android.content.Context;


    /**
     * 应用程序Activity管理类:用于Activity管理和应用程序退出
     * 
     * @author bobo
     * @version 1.0
     * @created 2015-05-26
     */
    public class AppManager {
        private static Stack<BaseActivity> activityStack;
        private static AppManager instance;

        private AppManager() {

        }

    /**
     * 单实例 , UI无需考虑多线程同步问题
     */
    public static AppManager getAppManager() {
        if (instance == null) {
            instance = new AppManager();
        }
        return instance;
    }

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

    /**
     * 获取当前Activity(栈顶Activity)
     */
    public BaseActivity currentActivity() {
        if (activityStack == null || activityStack.isEmpty()) {
            return null;
        }
        BaseActivity activity = activityStack.lastElement();
        return activity;
    }

    /**
     * 获取当前Activity(栈顶Activity) 没有找到则返回null
     */
    public BaseActivity findActivity(Class<?> cls) {
        BaseActivity activity = null;
        for (BaseActivity aty : activityStack) {
            if (aty.getClass().equals(cls)) {
                activity = aty;
                break;
            }
        }
        return activity;
    }

    /**
     * 结束当前Activity(栈顶Activity)
     */
    public void finishActivity() {
        BaseActivity activity = activityStack.lastElement();
        finishActivity(activity);
    }

    /**
     * 结束指定的Activity(重载)
     */
    public void finishActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 结束指定的Activity(重载)
     */
    public void finishActivity(Class<?> cls) {
        for (BaseActivity activity : activityStack) {
            if (activity.getClass().equals(cls)) {
                finishActivity(activity);
            }
        }
    }

    /**
     * 关闭除了指定activity以外的全部activity 如果cls不存在于栈中,则栈全部清空
     * 
     * @param cls
     */
    public void finishOthersActivity(Class<?> cls) {
        for (BaseActivity activity : activityStack) {
            if (!(activity.getClass().equals(cls))) {
                finishActivity(activity);
            }
        }
    }

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

    /**
     * 应用程序退出
     */
    public void AppExit(Context context) {
        try {
            finishAllActivity();
            ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.killBackgroundProcesses(context.getPackageName());
            System.exit(0);
        } catch (Exception e) {
            System.exit(0);
        }
    }
}

好,下面我们来看一下BaseActivity如何创建。

在我们的BaseActivity中,按照刚刚的逻辑,首先需要AppManager管理类的管理,也就是在每次创建Activity和销毁Activity的时候,向Activity栈中添加或移除该Activity。同时,我们会统一定制一些抽象函数,供他的子类实现。

下面我们就来看一下这个BaseActivity类中的onCreate()和onDestroy()的函数实现。


     /***************************************************************************
     *
     * 打印Activity生命周期
     *
        ***************************************************************************/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AppLog.debug(this.getClass().getName() + "---------onCreat ");

        // 竖屏锁定
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        if (mAllowFullScreen) {
            requestWindowFeature(Window.FEATURE_NO_TITLE); // 取消标题
        }

        AppManager.getAppManager().addActivity(this);
        initWidget();
    }

     @Override
    protected void onDestroy() {
        super.onDestroy();
        activityState = ACTIVITY_DESTROY;
        AppLog.state(this.getClass().getName()+ "---------onDestroy ");
        AppManager.getAppManager().finishActivity(this);
    }

这个是其中有实际操作的两个函数,下面我们来看一下具体的实现。


    package com.sdu.activities;

    import com.sdu.manager.AppManager;
    import com.sdu.utils.AppLog;

    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.Window;
    import android.widget.AdapterView;


    /**
     * 应用程序Activity的基类
     *
     * @author bobo
     * @version 1.0
     * @created 2015-05-26
     */
    public abstract class BaseActivity extends Activity implements
            OnClickListener,AdapterView.OnItemClickListener{

        private static final int ACTIVITY_RESUME = 0;
        private static final int ACTIVITY_STOP = 1;
        private static final int ACTIVITY_PAUSE = 2;
        private static final int ACTIVITY_DESTROY = 3;

        public int activityState;

        // 是否允许全屏
        private boolean mAllowFullScreen = true;

        public abstract void initWidget();

        public abstract void widgetClick(View v);

        public abstract void widgetItemClick(AdapterView<?> parent, View view, int position, long id);

        public void setAllowFullScreen(boolean allowFullScreen) {
            this.mAllowFullScreen = allowFullScreen;
        }

        /* 组件单击 */
        @Override
        public void onClick(View v) {
            widgetClick(v);

        }

        /* 组件项单击,例如ListView */
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            widgetItemClick(parent,view, position, id);
        }

        /***************************************************************************
         *
         * 打印Activity生命周期
         *
         ***************************************************************************/

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            AppLog.debug(this.getClass().getName() + "---------onCreat ");

            // 竖屏锁定
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            if (mAllowFullScreen) {
                requestWindowFeature(Window.FEATURE_NO_TITLE); // 取消标题
            }

            AppManager.getAppManager().addActivity(this);
            initWidget();
        }

        @Override
        protected void onStart() {
            super.onStart();
            AppLog.state(this.getClass().getName()+ "---------onStart ");
        }

        @Override
        protected void onResume() {
            super.onResume();
            activityState = ACTIVITY_RESUME;
            AppLog.state(this.getClass().getName()+ "---------onResume ");
        }

        @Override
        protected void onStop() {
            super.onResume();
            activityState = ACTIVITY_STOP;
            AppLog.state(this.getClass().getName()+ "---------onStop ");
        }

        @Override
        protected void onPause() {
            super.onPause();
            activityState = ACTIVITY_PAUSE;
            AppLog.state(this.getClass().getName()+ "---------onPause ");
        }

        @Override
        protected void onRestart() {
            super.onRestart();
            AppLog.state(this.getClass().getName()+ "---------onRestart ");
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            activityState = ACTIVITY_DESTROY;
            AppLog.state(this.getClass().getName()+ "---------onDestroy ");
            AppManager.getAppManager().finishActivity(this);
        }
    }

好了,到这里,我们最最基础的小框架算是搭建好了,在搭建框架的过程中,我们需要做的东西还是挺多的。

在这里,我们需要说明一下就是,刚刚可能有一个AppLog类,大家不知道是怎么回事,这个也是我们搭建的框架中的一个类,就是对Log类的重新封装,是我们的工具类,看看,是不是搭建一个小型的框架很简单的。

好了,这篇文章就先到这里,在这里,我附上我们第一个版本的下载地址,大家可以看一下,由于我现在也是在校大学生,并没有公司实践的经验,仅仅就是靠着自己的理解做过几个android的项目,大家有什么建议或者是我这里有出现问题的地方希望大家指正,希望我们能共同学习,谢谢。

代码下载地址

目录
相关文章
|
9月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
245 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
算法 JavaScript Android开发
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
593 1
|
12月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
508 8
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
1264 3
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
如何使用Amlogic T972安卓9.0系统上的misc框架来简化驱动程序开发,通过misc框架自动分配设备号并创建设备文件,从而减少代码量并避免设备号冲突。
218 0
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单

热门文章

最新文章