首先,这非常糟糕:
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();
}
现在,你可以将接口作为额外的参数添加到启动另一个Activity
的Intent
中:
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
,但这应该可以解决你的问题。
希望我能帮到你,如果你有任何进一步的问题,请随时问我!