博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓市场--框架搭建2
阅读量:6372 次
发布时间:2019-06-23

本文共 11778 字,大约阅读时间需要 39 分钟。

在上一篇中,我们回顾了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
activityStack; /** * 添加Activity到栈 */ public void addActivity(BaseActivity activity) { if (activityStack == null) { activityStack = new Stack
(); } 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
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
(); } 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的项目,大家有什么建议或者是我这里有出现问题的地方希望大家指正,希望我们能共同学习,谢谢。

转载于:https://www.cnblogs.com/bobo1223/p/7287552.html

你可能感兴趣的文章
物联网市场迅猛发展 “中国芯”如何把握机会?
查看>>
环球花木网的目标就是致力于打造成为“园林相关行业的专业性门户网站
查看>>
《编写高质量代码:改善c程序代码的125个建议》—— 建议14-1:尽量避免对未知的有符号数执行位操作...
查看>>
《C语言编程魔法书:基于C11标准》——2.2 整数在计算机中的表示
查看>>
全球程序员编程水平排行榜TOP50,中国排名第一
查看>>
HDFS 进化,Hadoop 即将拥抱对象存储?
查看>>
Edge 浏览器奇葩 bug:“123456”打印成“114447”
查看>>
Sirius —— 开源版的 Siri ,由 Google 支持
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 2.7 小结
查看>>
《Windows Server 2012活动目录管理实践》——第 2 章 部署第一台域控制器2.1 案例任务...
查看>>
Java Date Time 教程-时间测量
查看>>
Selector.wakeup实现注记
查看>>
《Java EE 7精粹》—— 第1章 Java EE 1.1 简介
查看>>
《Exchange Server 2013 SP1管理实践》——导读
查看>>
syslog:类Unix系统常用的log服务
查看>>
使用Annotation设计持久层
查看>>
深入实践Spring Boot2.4.1 Neo4j依赖配置
查看>>
Zen Cart 如何添加地址栏上的小图标
查看>>
SecureCrt 连接Redhat linux
查看>>
[NHibernate]持久化类(Persistent Classes)
查看>>