网络电台研究(2)自定义Application、BaseActivity管理统计数据、程序状态、应用程序完全退出

首先,关于使用单例自定义Application的好处是,管理全局变量。使用BaseActivity是体现了OOP思想里的继承,好处自然大家都知道的。那么通过这俩个,我们可以首先实现3个功能点。

1.统计数据

我们做APP,发布之后,统计哪些渠道下载量,留存用户,每天的活跃度等等。这种需要统计,我们程序中如何做呢,先看看友盟的吧。其实国内自己做的统计来源于修改国外的一个开源工程的底层SDK。来看看友盟如何正确配置统计代码。

我们要主要看onResume和onPause ,这俩个生命周期函数里配置。看下面第一句话,只有正确配置。因为做过的项目很多,所以经验而谈,若是项目中一个个Activity来配置太麻烦,万一哪一天有改动要全部替换的话,要折磨死人的。另外若是代码混乱,有的父类写了该方法,子类又写了,就导致配置不正确,统计数也会不正确。所以构建工程前要把这些问题想好了,这就是初步架构的思想,解决未发生的事情,更好的灵活性、扩展性。


那根据OOP里面的集成思想,我就写了个BaseActivity。在OnResume和OnPause实现这个方法即可。


2.程序状态。 比如当前是前台、后台等等。

比如Push 和通知,有的时候需求是用户在前台某一个页面情况下,不进行推送消息的提醒,在后台需要提醒等等。所以这个时候程序拿到当前的状态的就异常重要。同样的在OnResume和OnStop里面去配置,就简单多了。不用每个Activity去做


3.应用程序完全退出。 单例使用Application,确保只有一个唯一实例。在Application里面提供退出应用程序方法。这里要说一下,关于Android退出应用程序,其实并不是真正意义上的完全退出,这个归根到底要靠Android框架自己来处理。不过很多人使用System.exit(0) 亦或是Process.KillProcess()。这段代码生效的前提是,你的Activity栈里不能大于1个Activity,否则会杀掉进程,立即重新启动你的应用。关于Android底层到底如何管理的,为什么不能做到真正退出有兴趣可以看看这个  http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon    
咱们只讨论,咱们可以做到的。方法是,自己管理一个Activity队列,当程序要完全退出时,遍历该队列关闭全部现有栈中的Activity,然后调用Process.KillProcess()


以上请看代码,自定义Application

/**
 * 采用懒汉式单例获得唯一实例
 * 提供完全退出程序的方法,为了正统计自定义Activity栈的正确性,请在每一个Activity的OnCreate,OnDestory中,正确调用addActivity和removeActivity。
 *
 */
public class FMApplication extends Application {
	
	public static String TAG = "AutoFMApplication";
	
	//管理Activity的List,主要用于退出应用程序时,Finish所有Activity
	ArrayList<Activity> mActivityList = new ArrayList<Activity>();  ; 

	@Override
	public void onCreate() {
		super.onCreate();
	}
	
	 private static class AppHolder {  
	        static FMApplication instance = new FMApplication();  
	 }  
	  
	/**
	 * 获得Application实例
	 * @return
	 */
    public static FMApplication getInstance() {  
        return AppHolder.instance;  
    }  
    
    /**
     * 添加Activity到容器中  
     * @param activity 当前实例
     */
    public void addActivity(Activity activity)  
    {  
    	if(activity!=null){
    		mActivityList.add(activity);  
    	}
    } 
    
    /**
     * 移除容器中的Activity
     * @param activity 当前实例
     */
    public void removeActivity(Activity activity)  
    {  
    	if(activity!=null){
    		mActivityList.remove(activity);  
    	}
    } 
    
    /**
     * 退出应用程序
     */
    public void exitApplication() {  
        List<Activity> lists = mActivityList;  
        for (Activity a : lists) {  
            a.finish();  
        }  
        android.os.Process.killProcess(android.os.Process.myPid()); 
    }  

}

BaseActivity代码

/**
 * 1.所有Activity的基类,保证全部是该类的子类
 * 2.管理通用比如,统计、应用程序状态(后台、前台)、Activity队列(完全退出程序使用)
 * @author LiQiang
 *
 */
public class BaseActivity extends <span style="color:#FF0000;">FragmentActivity</span>{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//Activity进入自定义栈
		FMApplication.getInstance().addActivity(this);
		LogUtil.e(BaseActivity.class, "current activity add is " + this.getClass().getSimpleName());
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		//统计启动
		UmsAgent.onResume(this);
	}

	@Override
	protected void onPause() {
		super.onPause();
		//统计启动
		UmsAgent.onPause(this);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//Activity移除自定义栈
		FMApplication.getInstance().removeActivity(this);
		LogUtil.e(BaseActivity.class, "current activity remove is " + this.getClass().getSimpleName());
	}
	
}

请注意我代码片段中标红的“FragmentActivity” 我是强烈建议大伙的BaseActivity继承该类,我们看类关系结构。注意看,FragmentActivity是Activity的子类。它们的区别摘抄于官网:
FragmentActivity is a special activity provided in the Support Library to handle fragments on system versions older than API level 11.
 If the lowest system version you support is API level 11 or higher, then you can use a regular Activity.






简单来讲区别是: 3.0以下想使用Fragment功能,你得加入v4包,并且继承FragmentActivity,3.0以后的SDK,直接可以在Activity中使用getFragmentManager()即可,也就是说v4包解决了API是3.0以下想使用Fragment的方案。 按着现在2014年11月的时间,我们来看下全球安卓系统SDK使用情况:

大约还占据10%多的用户量,当然这个数据不太准确。但是有一定的参考价值。Android5.0着重解决碎片化问题,我们是对其有信心的。废话不多说了,继续看类结构图,我们可以看到ActionBarActivity是FragmentActivity的子类,我们不用看资料大概也可以猜到其目的。同理于v4包。我的建议是BaseActivity继承于FragmentActivity即可,v4包在当今的开发中必不可少的,但是继承于ActionBarActivity必要性没那么大了。毕竟要多导入一个v7.jar,当然了,想改造也是很方便的事儿。

了解学习更多 support-vx 包的功能和意义


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值