Android:如何在一个活动中向另一个活动发送界面?

27

我有一个像这样的界面:

public interface MyInterface {
    public void aMethod();
}

我的自定义对象:

public class MyObject {

    private Context context;
    private MyInterface inter;

    public MyObject(Context context) {
        this.context = context;
        this.inter = (MyInterface) this.context;
        inter.aMethod();
    }
}

主活动:

public class MainActivity extends Activity implements MyInterface {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyObject my = new MyObject(this);

    }

    @Override
    public void aMethod() {
        Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();
    }
}  

在这里,我可以在 MyObject 构造函数中从上下文中获取接口,然后与 Activity 通信。

但是如何将接口从一个活动发送到另一个活动?
我需要从 Activity2 调用 Activity1 中的方法
有没有类似这样的方法?

注意:我不想使用 fragment。


您的问题解决了吗?还需要进一步协助吗?请不要忘记接受最有帮助的答案! - Xaver Kapeller
2
卡在同一个问题上了,感谢您的提问 :) - Sudhanshu Gaur
你不能...也不应该...显然你应该知道,在最坏的情况下,只有一个活动是活跃的!相反,你应该使用正常的startActivityForResult/onActivityResult。 - Selvin
2个回答

54

首先,这非常糟糕:

this.inter = (MyInterface) this.context;

如果你传递了一个没有实现你的接口的上下文到构造函数中,你的应用程序将会崩溃,而且很容易犯这样的错误。因此,你可以看到,这非常容易出错。相反,应该像这样实现它:
public class MyObject {

    private Context context;
    private MyInterface inter;

    public MyObject(Context context, MyInterface inter) {
        this.context = context;
        this.inter =  inter;
        inter.aMethod();
    }
}

这样做更加安全,且更加清洁。


若要将 Object 发送到另一个 Activity,请确保它实现了 Serializable,像这样:

public interface MyInterface extends Serializable {
    public void aMethod();
}

现在,你可以将接口作为额外的参数添加到启动另一个ActivityIntent中:

Intent intent = new Intent(context, OtherActivity.class);
intent.putExtra("interface", inter);
startActivity(intent);

OtherActivity 中,您可以通过以下方式从 Intent 中获取 Object

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = getIntent();
    MyInterface inter = (MyInterface) intent.getSerializableExtra("interface");

    ...
}

编辑:

当您在Activity中执行以下操作时,您正在创建一个匿名类:

OnCreateListener inter = new OnCreateListener() {

    @Override
    public void onObjCreate() {
        Log.d("pltk", "dfgbfdgh");
    }
};

这样匿名类的一个问题是它们不是静态的,这意味着您仍然可以从创建此监听器的类中访问方法和变量。内部原因是该新类保留对创建它的类的实例的引用,在您的情况下是封闭的Activity。我们经常使用这种方式进行OnClickListener等操作,这是非常好的。但在您的情况下,这将成为一个问题,因为您想将此Object发送到另一个Activity。对旧Activity的内部引用使其无法序列化,这是一件好事。如果您可以像那样发送一个Object,则会由于所有垃圾收集器无法收集的旧引用而创建大量的内存泄漏。
解决方案非常简单,您可以将该类定义在自己的文件中或使该类静态。在这种情况下,静态意味着该类被视为它自己的单独文件,并且因此无法访问封闭类的实例。
因此,总结要做的就是保持类嵌套并定义它为静态,如下所示:
public class YourActivity extends Activity {

    private static class OnCreateListenerImpl implements OnCreateListener {

        @Override
        public void onObjCreate() {
            Log.d("pltk", "dfgbfdgh");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_palatok);

        OnCreateListener inter = new OnCreateListenerImpl();
        Intent in = new Intent(Palatok.this, SecondActivity.class);
        in.putExtra("ob", inter);
        startActivity(in);
    }
}

或者您可以将实现移动到自己的单独文件中:

public class OnCreateListenerImpl implements OnCreateListener {

    @Override
    public void onObjCreate() {
        Log.d("pltk", "dfgbfdgh");
    }
}

虽然我仍然不太清楚为什么你想要将一个OnCreateListener发送到另一个Activity,但这应该可以解决你的问题。
希望我能帮到你,如果你有任何进一步的问题,请随时问我!

2
无论如何,错误就在日志中:Caused by: java.io.NotSerializableException: com.example.palatok.Palatokcom.example.palatok.Palatok 是你的 Activity 吗? - Xaver Kapeller
1
我就知道 :) 我会编辑我的答案并提供解决方案。 - Xaver Kapeller
这是一个可怕的解决方案,请不要使用它!很明显它不起作用:首先让我们将 Log.d 替换为 setTitle ... 其次让我们启用 "不保留活动" ... 在最坏的情况下,只有一个 Activity 是活动的 ... 回到上一个 Activity 时(在这种情况下)显然会创建新实例 ... - Selvin
在最糟糕的情况下,您编辑后的代码只相当于从第二个活动调用new OnCreateListenerImpl.onObjCreate();,这使得通过Intent传递接口变得无用。 - Selvin
1
这是不可能的,因为Serializable接口不能像那样传递,因为它的父类可能不可序列化。这很可能会导致崩溃。 - Shark
显示剩余7条评论

3

我只需要从Activity2访问Activity1的私有变量,就这样。 - palatok
但是你为什么想要访问一个私有变量呢? - Shruti
@palatok 你试过使用SharedPreferences了吗? - Stepango
我在Activity1中有一个大对象,其他活动需要从这个对象获取数据。 - palatok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接