安卓市场--框架搭建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类的重新封装,是我们的工具类,看看,是不是搭建一个小型的框架很简单的。
好了,这篇文章就先到这里,在这里,我附上我们第一个版本的下载地址,大家可以看一下,由于我现在也是在校大学生,并没有公司实践的经验,仅仅就是靠着自己的理解做过几个android的项目,大家有什么建议或者是我这里有出现问题的地方希望大家指正,希望我们能共同学习,谢谢。