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

Posted

技术标签:

【中文标题】Android:如何将界面从一个活动发送到另一个活动【英文标题】:Android: How to send interface from one activity to another 【发布时间】:2014-09-06 22:26:48 【问题描述】:

我有一个这样的界面:

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 中的一个方法 有没有这样的方法?

注意:我不想使用片段。

【问题讨论】:

您的问题解决了吗,还是需要进一步的帮助?请不要忘记接受对您最有帮助的答案! 遇到了同样的问题,感谢您提出质疑 :) 你不能......而且你不应该......显然你应该知道在最坏的情况下 只有一个活动是活着的! 。 .. 相反,您应该使用正常的 startActivityForResult/onActivityResult 【参考方案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();
    

这样更安全、更清洁。


要将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,但这应该可以解决您的问题。

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

【讨论】:

将其编辑到您的问题中,不要链接到它...无论如何,错误就在日志中:Caused by: java.io.NotSerializableException: com.example.palatok.Palatokcom.example.palatok.Palatok 是你的 Activity 吗? 我是这么想的 :) 我会用解决方案编辑我的答案。 非常感谢,它成功了。还有一个问题。如果我在单独的文件中编写类,那么我将无法访问 Activity 中的变量,所以我总是需要制作静态类,在 Activity 中编写静态类是一种好习惯吗? 无论哪种方式,您都无法访问Activity 实例。有一个嵌套的静态类是可以的。它总是取决于具体情况是否良好的做法。在您的情况下,您尝试将侦听器传递给单独的Activity 是很奇怪的。我会比一些静态嵌套类更担心这一点。 这是不可能的,因为Serializable 接口不能像那样传递,因为它的父类可能不是可序列化的。这很可能会导致崩溃。【参考方案2】:

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

【讨论】:

我只需要从Activity2访问Activity1的私有变量就可以了。 但是你想访问私有变量吗?? @palatok 你试过 SharedPreferences 了吗? 我在Activity1中有一个大对象,其他活动需要这个对象的数据

以上是关于Android:如何将界面从一个活动发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从一个片段传输到另一个片段android

如何在android中将图像从一个活动发送到另一个活动

将arraylist从一个活动发送到另一个活动到listview android [重复]

无法在Android中将变量值从一个活动发送到另一个活动

android - 将toast从一个活动传递到另一个活动

如何在 Android Java 中将 1000 多个项目列表从一个 Activity 发送到另一个?