phenomLi / Blog

Comments, Thoughts, Conclusions, Ideas, and the progress.
219 stars 17 forks source link

记一个小技巧:一个Activity调用另一个Activity中的非静态方法 #19

Open phenomLi opened 6 years ago

phenomLi commented 6 years ago

有时候我们想要在一个ActivityA中,去调用另一个ActivityB的方法,那么我们可以在ActivityB中,将这个方法设置为静态方法:
ActivityB:

//ActivityB
public class ActivityB {
    public static void method() {
        Log.i("", "我是ActivityB的方法。");
    }
}

在ActivityA中调用:

//ActivityA
ActivityB.method();


但是,假如ActivityB中的method方法不是一个静态方法,那么ActivityA想要调用它,又该怎么办呢?
有人也许会说,把method声明为static或者把方法抽象成公共类不就行了吗?说是这样说,但是有些条件下,并不允许这样做:


道理我都懂,那么究竟该怎么做呢?

既然我们无法直接从类上访问这个方法,那么我们可以使用一个中介,这个中介是这个类的实例,通过这个中介来访问该方法,而为了使这个中介可以被访问,我们要使用一个静态变量来保存这个中介。
步骤如下:

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的办法打补丁倒不如认认真真去把代码重构一下。