活动到活动回调侦听器

Vas*_*Doe 4 java android callback listener

让我们假设 2 个活动Activity1Activity2。我需要调用方法methodAct1()(内Activity1从)methodAct2(内部Activity2)。我认为它应该使用回调侦听器工作 - 我不想使用EventBus库!

我得到 java.lang.NullPointerException使用这个代码:

界面:

public interface MyListener {
    public void listen();
}
Run Code Online (Sandbox Code Playgroud)

创建事件的活动:

public class Activity2 extends Activity {

    private MyListener  myListener;

    public void setUpListener(MyListener myListener) {
        this.myListener = myListener;
    }

    private void doWork(){
        //do stuff 
        myListener.listen();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望在工作完成后获得该事件的活动:

public class Activity1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Activity2 activity2 = new Activity2();
        activity2.setUpListener(new setUpListener() {
            @Override
            public void listen() {
                // get the event here

            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Kno*_*sos 7

这是绝对不可能的。你永远不会自己实例化一个新的 Activity。您不会同时运行两个活动。

如果您希望另一个 Activity 根据您之前的 Activity 想要做某事,那么您需要将其添加到您的 Intent 中。

Intent intent = new Intent(this, Activity2.class);
intent.putExtra("data field", "data value");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

如果您希望通过回调实现特定功能,那么您可能会考虑Fragments。通过这种方式,您可以运行相同的 Activity,并且它可以告诉各个 Fragment 他们需要做什么。


ΦXo*_*a ツ 5

NPE 的发生是因为您的声明:

Activity2 activity2 = new Activity2(); <--
Run Code Online (Sandbox Code Playgroud)

您永远不应该这样做,而应该在活动 1 中执行以下操作:

Intent intent = new Intent(this, Activity2.class);
intent.putExtra("dataKey", "dataValue");
startActivityForResult(pickContactIntent, CALLBACK_REQUEST);
Run Code Online (Sandbox Code Playgroud)

startActivityForResult ()提供从 Activity 2 到 Activity 1 的回调,您必须覆盖 Activity 1 中的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == CALLBACK_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)