### Android定制自己的日志工具
开发过程中为了调试而在各个地方打印日志,但是当项目完成需要上线的时候, 会发现大量的日志为删除,会打印出来,一方面会降低性能,另一方面会泄漏机密性数据。然是一行一行删除又太麻烦,所以最好的办法是能够自由的控制日志的打印,在程序处于开发阶段就让日志打印出来,当程序上线之后就把日志屏蔽掉。
新建一个LogUtil类:
public class LogUtil {
public static final int VERBOSE = 1; //啰嗦的
public static final int DEBUG = 2; //调试的
public static final int INFO = 3; //信息
public static final int WARN = 4; //警告
public static final int ERROR = 5; //错误
public static final int NOTHING = 6; //没有事情
public static int level = VERBOSE;
public static void v(String tag, String msg){
if(level <= VERBOSE){
Log.v(tag, msg);
}
}
public static void d(String tag, String msg){
if(level <=DEBUG) {
Log.d(tag, msg);
}
}
public static void i(String tag, String msg){
if(level <=INFO){
Log.i(tag,msg);
}
}
public static void w(String tag, String msg){
if(level <=WARN){
Log.w(tag, msg);
}
}
public static void e(String tag, String msg){
if(level <=ERROR){
Log.e(tag, msg);
}
}
}
这样就把一个自定义的日志工具创建好了,之后在项目里我们可以像使用普通日志一样使用LogUtil:
LogUtil.d("TAG","debug log");
LogUtil.w("TAG","warn log");
然后我们只需要修改 level变量的值,就可以自由地控制日志的打印行为了。比如让level等于VERBOSE就可以把所以的日志打印出来,让level等于WRAN就可以值打印警告以上级别的日志,让level等于NOTHING就可以把所有日志都屏蔽掉。这样日志的打印就变得可控了。
设置并获取全局Context
Android 提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类初始化,而我们可以定制一个自己的Application类继承Applicaton
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate(){
context = getApplicationContext();
}
public static Context getContext(){
return context;
}
}
我们重写了父类的onCreate 方法,并通过调用getApplicatonContext() 方法得到了一个应用程序级别的Context,然后又提供了一个静态的getContext() 方法,并然后刚才获取到的Context。
接下来我们需要告知系统,当程序启动的时候应该初始化MyApplication类,而不是默认的Application类。在AndroidManifest.xml 文件的<Application 标签下进行指定就可以了,代码如下:
<manifest xmlns:android=“http://schemas.android.com/apk/res/android”
package="com.example.networktest"
android:versionCode="1"
android:versionName="1.0" >
...
<application
android:name="com.example.networktest.MyApplication" //这句就是让系统初始化MyApplication类
...>
...
</application>3
</manifest>
注意,这里在指定MyApplication的时候一定要加上完整的包名,不然系统无法找到这个类。
这个我们就已经实现了一种全局获取Context的机制,以后无论你想在项目的任何地方使用Context,只需要调用以下MyApplication.getContext() 就可以了。
统一管理Activity
为了知道当前Activity是哪个类,或者在退出APP时如何finish掉所有的Activity。
首先我们可以定义一个基类Activity,之后所创建的所有Activity都继承这个基类,好做统一化管理。然后我们可以创建一个Application,在Application里面定一个静态变量List<Activity ,关键就是这个变量。每当一个Activity创建后,就将这个Activity实例添加到这个list中,每当一个activity finish后,就将这个Activity从list中移除。如果想一键退出APP,就直接遍历list中所有的activity,都执行finish退出,并清空list。
创建自定义Application(作用:当做Activity的容器,可以暴露添加,删除,执行finish等 方法)
public class MyApplication extends Application{
private static Context context; //全局Context
private List<Activity> activityList = new ArrayList<Activity>();
private static MyApplication instance;
public static MyApplication getMyApplication() { //获取Application单利
if (instance == null) {
instance = new MyApplication();
}
return instance;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
context = getApplicationContext();
}
public static Context getContext(){ //获取全局Context的静态方法
return context;
}
//添加Activity
public void addActivity(Activity activity){
activityList.add(activity);
}
//移除某个Activity
public void finishSingle(Activity activity){
activityList.remove(activity);
if(!activity.isFinishing()){
activity.finish();
}
}
//移除所有的activity(一键退出)
public void finishAll(){
for(Activity activity : activityList) {
if(!activity.isFinishing()) {
activity.finish();
}
}
//该句 用于杀掉当前进程
android.os.Process.killProcess(android.os.Process.myPid());
//你也可以回到主界面
}
}
创建Activity基类(作用:对所有的activity做统一的操作,如打印当前activity的类名,将activity加入list或移出list)
public class BaseActivity extends Activity{
protected MyApplication myApplication = MyApplication.getMyApplication();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//添加activity
myApplication.addActivity(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
myApplication.finishSingle(this);
}
}