什么是AOP面向切面架构设计?
Android 4.0 以后 Google 推出了 ActivityLifecycleCallbacks接口就是AOP面向切面架构设计的。
简单使用介绍如下:能监听应用每个activity的生命周期。
public class myApp extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
Log.d("mile",activity.getComponentName().getClassName() + "onActivityCreated");
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
实现一个简单数据库面向切面架构设计
场景如下:操作数据库“增删改”前需要先备份一下, 由于 增加、删除、修改都需要去备份一下,这里我们就可以使用切面架构设计思想来完成。核心是动态代理
创建一个数据库操作接口
/**
* Created by mile on 2019/9/15.
*/
public interface DBHelper {
void insert();
void delete();
void update();
//数据备份
void save();
}
在MainActivity中实现该接口,只是个例子一般情况下不是Activity来实现这个接口
public class MainActivity extends AppCompatActivity implements DBHelper {
private static final String TAG = "MainActivity";
private DBHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = (DBHelper) Proxy.newProxyInstance(DBHelper.class.getClassLoader(),new Class[]{DBHelper.class},
new DBHandler(this));
}
private class DBHandler implements InvocationHandler {
private DBHelper db;
public DBHandler(DBHelper db) {
this.db = db;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
if (db != null){
Log.d(TAG,"操作数据库前------");
save();
Log.d(TAG,"备份成功------");
return method.invoke(db,objects);
}
return null;
}
}
@Override
public void insert() {
Log.d(TAG,"插入数据---------------------------");
}
@Override
public void delete() {
Log.d(TAG,"删除数据---------------------------");
}
@Override
public void update() {
Log.d(TAG,"更新数据---------------------------");
}
@Override
public void save() {
Log.d(TAG,"保存数据---------------------------");
}
//点击删除按钮
public void delete(View view) {
db.delete();
}
}
核心代码如下:
db = (DBHelper) Proxy.newProxyInstance(DBHelper.class.getClassLoader(),new Class[]{DBHelper.class},
new DBHandler(this));
}
private class DBHandler implements InvocationHandler {
private DBHelper db;
public DBHandler(DBHelper db) {
this.db = db;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
if (db != null){
Log.d(TAG,"操作数据库前------");
save();
Log.d(TAG,"备份成功------");
return method.invoke(db,objects);
}
return null;
}
}