Description
有时候我们想要在一个ActivityA
中,去调用另一个ActivityB
的方法,那么我们可以在ActivityB
中,将这个方法设置为静态方法:
ActivityB:
//ActivityB
public class ActivityB {
public static void method() {
Log.i("", "我是ActivityB的方法。");
}
}
在ActivityA中调用:
//ActivityA
ActivityB.method();
但是,假如ActivityB
中的method
方法不是一个静态方法,那么ActivityA
想要调用它,又该怎么办呢?
有人也许会说,把method
声明为static
或者把方法抽象成公共类不就行了吗?说是这样说,但是有些条件下,并不允许这样做:
-
受限于业务,一个方法里面的逻辑可能会非常复杂,引用了许多的临时变量或者非静态变量,为了这样一个要求而把里面的所有变量都设置为静态变量,这显然是一种得不偿失的做法,首先注册为静态变量,意味着不能被GC(Garbage Clean)。第二,可能不止这一个方法引用了这些变量,一个变量改了,可能其他方法也要改,会造成牵一发而动全身的情况。
-
有时候方法里面的变量不是临时变量,而是该
Activity
类的属性(或者依赖于该Activity
类),那么这个方法就无法被抽象成公共类。
道理我都懂,那么究竟该怎么做呢?
既然我们无法直接从类上访问这个方法,那么我们可以使用一个中介,这个中介是这个类的实例,通过这个中介来访问该方法,而为了使这个中介可以被访问,我们要使用一个静态变量来保存这个中介。
步骤如下:
1.首先,在ActivityB
中声明一个静态(中介)变量context
,这个变量是保存ActivityB
的实例的。
public class ActivityB extends AppCompatActivity {
//中介变量context
private static ActivityB context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//非静态的公共方法
public void method() {
Log.i("", "我是ActivityB的方法。");
}
}
2.之后,在onCreate
中,将ActivityB
的实例指向context
。
public class ActivityB extends AppCompatActivity {
//中介变量context
private static ActivityB context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化context
context = this;
}
//非静态的公共方法
public void method() {
Log.i("", "我是ActivityB的方法。");
}
}
3.最后,我们增加一个getActivity
的公共静态方法,用作将context
暴露出去。
public class ActivityB extends AppCompatActivity {
//中介变量context
private static ActivityB context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化context
context = this;
}
//非静态的公共方法
public void method() {
Log.i("", "我是ActivityB的方法。");
}
//使用这个方法,使得其他类可以访问context
public static Activity getActivity() {
return context;
}
}
之后,我们在ActivityA
中就可以愉快地通过getActivity
中访问ActivityB
中的非静态方法method
了:
ActivityB.getActivity().method();
哈哈。
最后还是要说一句,其实在日常开发中,最好少使用这些hack的方法,一来容易造成内存泄漏,二来,当你发现你要调用另一个Activity
中的方法而这个方法又很难抽象成公共类的时候,说明你的代码耦合度已经比较高了,也就是说架构出现问题了(没错我就是这么菜)。这时候与其用这些hack的办法打补丁倒不如认认真真去把代码重构一下。