Android:如何将界面从一个活动发送到另一个活动编辑:

2022-09-01 16:55:14

我有一个这样的界面:

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构造函数中,我可以从上下文中获取接口,然后与活动进行通信。

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

注意:我不想使用片段。


答案 1

首先,这是非常糟糕的:

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();
    }
}

这样,它更安全,更干净。


要将 发送到另一个,请确保它实现如下:ObjectActivitySerializable

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

现在,您可以将接口作为额外的界面添加到开始另一个界面中:IntentActivity

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

在你可以得到从这样的:OtherActivityObjectIntent

@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");
    }
};

关于这种匿名类的事情是它们不是静态的,这意味着您仍然可以从嵌套此侦听器的类中访问方法和变量。在内部,这样做的原因是这个新类保留了对创建它的类的实例的引用,在你的例子中是封闭的。这是一件好事,我们一直使用它等。但是在您的情况下,这是一个问题,因为您想将其发送给另一个 .对旧的内部引用可以防止它被序列化,这是一件好事。如果您可以发送类似的内容,则会创建疯狂的内存泄漏,因为垃圾回收器无法收集的所有旧引用。ActivityOnClickListenerObjectActivityActivityObject

解决方案非常简单,您可以在其自己的文件中定义类,也可以使类成为静态的。在此上下文中,静态意味着该类基本上被视为它自己的单独文件中,因此无法访问封闭类的实例。

因此,总结一下您要做的就是保持类嵌套并像这样定义它:

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");
    }
}

虽然你为什么想发送一个到另一个仍然逃避我,但这应该解决你的问题。OnCreateListenerActivity

我希望我能提供帮助,如果您有任何其他问题,请随时提问!


答案 2

这是可能的,但这种活动<>活动交互将导致内存泄漏。您应该改用 LocalBroadcastManager (http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html)。