在两个打开的活动之间来回移动数据

Moving data back and forth between two open activities

我有两个活动 - act1 和 act2。我想在用户按下按钮时将字符串从 act1 传输到 act2,经过一些计算后我想将 LatLng 从 act2 传输到 act1,同时保持两个活动都打开(或者至少能够恢复每个更改在 act2 从应用开始)。


我试过的东西:


背景(如果相关):

我有一个包含两个 Activity 的应用程序 - main,它存储一个 ListView 和一个地图 activity。

地图必须在每个保存的地址中放置一个标记。

列表有两种按钮类型:

  1. “添加新地点...”,即打开地图 activity,并在用户想要的位置添加新标记。
  2. -some address-,即在这个地址对应的位置打开地图

我需要一种方法将所需地址传递给地图,以便它显示该位置,而且我还需要在创建位置后将新保存的地址传递回主 activity。

如果您想要一种更简洁的方法,并且您关心架构设计:

  • 为每个 activity
  • 创建一个 ViewModel
  • 创建一个 ViewModel 访问的单例,并使用它来共享数据。

单身人士可能是这样的:

object AddressManager{
    
    fun saveAddress(address: Address) {
        
    }
    
    fun getAddress(): Address{
        
    }
}

当然,我建议你使用Dagger和Hilt进行注入,不要使用“object”,但这又是越来越多的设计思路。

您可以使用 存储库模式 以您应用中的所有代码都可以访问的方式存储数据。

什么是存储库

存储库是一个简单的 class,它保存一些数据并提供对这些数据的访问。类似于:

class Repository {
    
    private String theString = "";

    public void setTheString(String newValue) {
        theString = newValue;
    }

    public String getTheString( {
        return theString;
    }
}

最好为存储库指定一个更具描述性的名称。因此,如果这是一个存储位置数据的存储库,您可以将其命名为 LocationRepository.

应该在哪里创建?

保存对它的引用的一个好地方是 Application class。如果没有,可以这样定义:

class MyApplication extends Application {
    
    private Repository repository = new Repository();

    public Repository getRepository() {
        return repository;
    }    
}
  • 需要扩展android框架提供的Applicationclass
  • 您还可以覆盖 onCreate() 方法以进行更复杂的初始化,如果您的情况需要的话

在清单

中定义应用程序class

为了让 android 框架了解您的自定义 Application class 您需要在 AndroidManifest.xml:

中定义它
<application
        android:name=".MyApplication"
        ...

在您的活动中访问存储库

现在,在每个 activity 中,您可以将应用程序上下文投射到您的应用程序中 class:

class MainActivity extends AppCompatActivity {

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

        Repository repository = ((MyApplication) getApplicationContext()).getRepository();
        System.out.println(repository.getTheString());
    }
}