Skip to content

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

Open
@phenomLi

Description

@phenomLi

有时候我们想要在一个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的办法打补丁倒不如认认真真去把代码重构一下。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions