天天看點

安卓市場--架構搭建2

版權聲明:您好,轉載請留下本人部落格的位址,謝謝 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的項目,大家有什麼建議或者是我這裡有出現問題的地方希望大家指正,希望我們能共同學習,謝謝。

代碼下載下傳位址

繼續閱讀