简体   繁体   English

我可以在Android中没有意图的情况下在活动之间移动对象吗?

[英]Can I move objects between activities without intents in Android?

The point is that from Activity A to BI need to create Activity B every time, but I don't close Activity A because when I return to Activity A from B, I simply finish Activity B but I don't create Activity A because I didn't finished it. 关键是,从活动A到BI每次都需要创建活动B,但是我不会关闭活动A,因为当我从活动B返回活动A时,我只是完成了活动B,但是我不创建活动A,因为我没有完成。 That is what I want. 那就是我想要的。

The problem is when I try to pass data and objects from Activity B to A. I can't use intents and putExtra() because I don't start Activity A, I simply resume it with onResume(). 问题是,当我尝试将数据和对象从活动B传递到A时,由于无法启动活动A,因此无法使用intent和putExtra(),而只是使用onResume()恢复它。

SharedPreferences don't let me to pass objects so does anyone knows if there's any method to pass objects from B to A? SharedPreferences不允许我传递对象,所以有人知道是否有任何方法可以将对象从B传递给A?

SOLUTION: http://www.javatpoint.com/android-startactivityforresult-example 解决方案: http : //www.javatpoint.com/android-startactivityforresult-example

Thanks to @brightstar @ThMBc @Avtar Guleira @Edy Bolos that's was I looking for :) 感谢@brightstar @ThMBc @Avtar Guleira @Edy Bolos我一直在寻找它:)

You can start activity B using startActivityForResult, and then return from it to A your data inside intent. 您可以使用startActivityForResult启动活动B,然后将其在intent中的数据从活动B返回到A。 You can find example on it here: 您可以在此处找到示例:

http://developer.android.com/reference/android/app/Activity.html http://developer.android.com/reference/android/app/Activity.html

There are different methods for different cases. 对于不同的情况有不同的方法。 If the object created in B is going to be used application wide, you might consider giving it to the appliction, so that every activity can reach it by 如果要在B中创建的对象将在整个应用程序中使用,则可以考虑将其提供给应用程序,以便每个活动都可以通过

.getAppliction().getMyField() 

Note that using a static field in a general class almost comes down to the same thing, but this follows the rules of encapsulation. 注意,在通用类中使用静态字段几乎可以归结为同一件事,但这遵循了封装规则。

If B is launched purely for the creation of the resulting object then starting an activity for result is the way to go, as brightstar said: 如果B纯粹是为了创建结果对象而启动的,那么为结果启动活动是必须走的路,正如Brightstar所说:

.startActivityForResult()

as documented in the android dev docs android dev docs中所述

Technically you can also pass objects through sharedPrefs if you serialize them (eg converting them to a json object and passing a string in prefs), but that is not really the way one would do this. 从技术上讲,如果对对象进行序列化(例如,将它们转换为json对象并在prefs中传递字符串),则也可以通过sharedPrefs传递对象,但这实际上并不是这样做的方式。

Yes you can do it. 是的,你可以做到。 For Example: Create a standalone java class 例如:创建一个独立的Java类

Class C {
  public static ArrayList<YourObject> myList;

} }

Import the C class header 导入C类头

enter code here
Class B {
   myList.add()
}

import C class header 导入C类头

Class A{
 myList.get(index)

} }

Use an Singleton-Class to store and retrieve objects. 使用Singleton类存储和检索对象。

public class Model {
    private static Model model = null;

    private Object myObject;

    private Model() {}

    public static Model getInstance() {
        if (model == null) {
            model = new Model();
        }
        return model;
    }

    public Object getMyObject(){
        return myObject;
    }

    public setMyObject(Object myObject){
        this.myObject = myObject;
    }
}

When you are in Activity A you store the objects you need in the model and retrieve them afterwards in activity B 当您处于活动A中时,可以将所需的对象存储在模型中,然后在活动B中进行检索。

You can create another Class and create static properties which will hold your objects for you. 您可以创建另一个并创建将为您保留对象的静态属性。 Please look. 敬请期待。

Class Utils {
  public static MyObject object;
  public static int index;
}

Use it like 像这样使用

Utils.object = new MyObject();
Utils.index = 4;

You cann't transfer object as per you scenario because you are not calling Activity A directly(means startactivity).You can achieve this scenario in another way. 您不能按照您的方案传输对象,因为您没有直接调用Activity A(意味着startactivity)。您可以通过另一种方式来实现此方案。 You have to set/save data in Application class from Activity B and then you can get data from application class in activiy A onResume() method and do whatever you want. 您必须在活动B的应用程序类中设置/保存数据,然后才能在活动A的onResume()方法中从应用程序类获取数据,然后执行所需的任何操作。

Follow below steps: 请按照以下步骤操作:

  1. Just start Activity B using startActivityForResult method instead of startActivity 只需使用startActivityForResult方法而不是startActivity启动活动B
  2. Then override onActivityResult in your Activity A. 然后在活动A中覆盖onActivityResult。
  3. When you want to finish or onBackPressed Activity B. just pass data using intent in setResult Method 当您想完成活动或onBackPressed活动B时,只需在setResult方法中使用intent传递数据

For complete documentation you can view this link: Getting a Result from an Activity 有关完整的文档,您可以查看以下链接: 从活动获取结果

So, when ever Activity B will finished OnActivityResult will be called of Activity A. In this method you will get Intent that you have set from Activity B. You can whatever you wan to do man then. 因此,每当活动B完成时,就会调用活动A的OnActivityResult。在这种方法中,您将获得从活动B中设置的Intent。然后您可以执行任何操作。

Please just don't use static fields!!! 请只是不要使用静态字段!!! It really bad practice, and you can encounter concurrency issues. 这确实是不好的做法,您可能会遇到并发问题。 You can easily accomplish your request by starting activity B with startActivityForResult, and then in activity B you can catch the result by overriding onActivityResult method, like described here: http://developer.android.com/reference/android/app/Activity.html#StartingActivities 您可以通过使用startActivityForResult启动活动B轻松完成请求,然后在活动B中通过覆盖onActivityResult方法来捕获结果,如此处所述: http : //developer.android.com/reference/android/app/Activity。 HTML#StartingActivities

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM