zoukankan      html  css  js  c++  java
  • 安卓市场--框架搭建2

    在上一篇中,我们回想了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类的又一次封装。是我们的工具类。看看。是不是搭建一个小型的框架非常easy的。

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

    代码下载地址

  • 相关阅读:
    LeetCode 206. Reverse Linked List倒置链表 C++
    spring security 5 There is no PasswordEncoder mapped for the id "null" 错误
    jdk 1.8下 java ArrayList 添加元素解析
    qt (5.60/5.70) 编译 QOCI 驱动
    ps快捷键
    使用jquery中height()方法获取各种高度
    事件委托live,delegate,on区别
    ajax获取数据后怎么去渲染到页面?
    JavaScript:document.execCommand()的用法
    兼容IE FF 获取鼠标位置
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7040120.html
Copyright © 2011-2022 走看看