protected void onPause() {
super.onPause();
Log.e(TAG, “onPause”);
}
protected void onStop() {
super.onStop();
Log.e(TAG, “onStop”);
}
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, “onDestroy”);
}
private void checkPhoneState(){
if(checkPermission(“android.permission.READ_PHONE_STATE”)== false){
Log.e(TAG,“have no permission to read phone state”);
return;
}
Log.e(TAG,“Read Phone State succeed”);
return;
}
private boolean checkPermission(String permissionName){
try{
PackageManager pm = getPackageManager();
//调用PackageMangaer的checkPermission函数,检查自己是否申明使用某权限
int nret = pm.checkPermission(permissionName,getPackageName());
return nret == PackageManager.PERMISSION_GRANTED;
}…
}
}
代码很简单。但是从这个小例子中,你也会发现要是这个程序比较复杂的话,到处都加Log,或者在某些特殊函数加权限检查的代码,真的是一件挺繁琐的事情。
三、使用AspectJ在Android中实现Aop
AOP虽然是方法论,但就好像OOP中的Java一样,一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了,它是一种几乎和Java完全一样的语言,而且完全兼容Java(AspectJ应该就是一种扩展Java,但它不是像Groovy[1]那样的拓展。)。当然,除了使用AspectJ特殊的语言外,AspectJ还支持原生的Java,只要加上对应的AspectJ注解就好。
用AspectJ的方法很简单,首先是定义一个DebugLog注解:
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.CLASS;
@Target({TYPE, METHOD, CONSTRUCTOR}) @Retention(CLASS)
public @interface DebugLog {
}
接下来就是使用AspectJ的方式,其设置PointCut:
@Aspect
public class Hugo {