【问题标题】:How to prevent passing data to multiple activities through intent?如何防止通过意图将数据传递给多个活动?
【发布时间】:2018-01-18 15:30:33
【问题描述】:

我有一个活动 A,它通过 Intent 将数据传递给活动 B。现在 Activity B 调用 Activity C,而 Activity C 调用 Activity D。现在 Activity D 正在调用 Activity B。现在 Activity B 检查 Intent 数据,但 Activity D 没有传递任何数据。

现在一种方法是通过 C 和 D 传递数据,最后在 B 中获取数据,但我想知道是否有更好的方法来处理这个问题?

我想补充一点,数据可以是一个有很多变量和数组的对象。

编辑:- 活动 B 的工作需要数据。

提前致谢。

【问题讨论】:

  • 如果您将相同的数据传递给许多活动,请使用 Sharedpreference 而不是 intent.putextra()
  • 嗨@ANUJ GUPTA,它以以下方式存储数据的简单方法,例如,1)使用SharedPreferences 2)像pojo类概念一样存储在getter setter中。
  • 使用可以用android:launchMode="singleTop"创建和活动到ActivityB然后它会再次打开调用C的同一个实例
  • 我传递的数据可以是一个对象,因此不能使用共享首选项。这是一个支持这个stackoverflow.com/questions/5418160/…的链接
  • 是的,在共享首选项中,您还可以使用库 compile 'com.google.code.gson:gson:2.7' 中的对象

标签: android android-intent android-activity


【解决方案1】:

如果您传递的数据不同,则使用调用意图的活动的名称分配一个变量(名为activity_name)。通过这种方式,您可以检查您是从活动 A 还是 D 进入活动 B。

让我试着用一个例子来解释一下:

活动A

String activity_name = "ACTIVITY_A";

Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("calling_activity", activity_name);
intent.putExtra("your_data", your_data); 
startActivity(intent);

活动B

Intent intent = getIntent();
String callingActivity = intent.getExtras().getString("calling_activity");

if (callingActivity.matches("ACTIVITY_A")) {
    // Do something
} else if (callingActivity.matches("ACTIVITY_D")) {
    // Do something else
}

ActivityD

String activity_name = "ACTIVITY_D";

Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("calling_activity", activity_name);
// No passed data in Actiivty D
startActivity(intent);

可以使用 SharedPreferences 来使用相同的逻辑,如其他答案和 cmets 中所述。

【讨论】:

  • 请检查编辑数据是 B 工作所必需的。
【解决方案2】:

使用共享偏好;

用于存储值;

SharedPreferences sp=getSharedPreferences("Login", Context.MODE_PRIVATE);
SharedPreferences.Editor Ed=sp.edit();
Ed.putString("id",login_id.getText().toString() );
Ed.putString("password",login_password.getText().toString() );
Ed.commit();

用于获取值;

SharedPreferences sharedPreferences = getSharedPreferences("Login", MODE_PRIVATE);
String uName = sharedPreferences.getString("id", "");
String password = sharedPreferences.getString("password", "");

【讨论】:

  • 对不起,但在我的问题中,我提到的数据可以是一个对象。你有针对这种情况的解决方案吗?
  • 您可以传递任何对象来代替 login_id.getText().toString() 和 login_password.getText().toString()
【解决方案3】:

您可以使用 gson.jar 将类对象存储到 SharedPreferences 中。

在 Gradle 文件中添加 GSON 依赖项:

compile 'com.google.code.gson:gson:2.7'

创建共享偏好:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

保存:

  Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(MyObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

检索:

    Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

【讨论】:

    【解决方案4】:

    您可以通过获取 Bundle 来检查您的 Intent 是否为 null 及其是否具有 Extras 值,然后再检查 Bundle oBject 是否为 null,然后检查密钥是否存在于 Bundle Object 中。

    Intent intent = getIntent();
     if(intent!=null)
     {
       Bundle bundle =  intent.getExtras();
       if(bundle!=null)
       {
          if(bundle.containsKey("key"))
          {
          //here you can put your code for Actvity B when comes from Activity  A.
          }
       }
     } 
    

    编辑 1 在清单文件的 Activity B 中使用 singleTask launchMode。

    android:launchMode="singleTask" 
    

    【讨论】:

    • 你想要所有活动中的数据
    • 不,我只需要它在 B 而不是 C & D
    【解决方案5】:

    在您的活动 B 中编写以下代码。

    String str= getIntent().getStringExtra("key");
    
    if (str == null){
    str= "";
    }
    

    【讨论】:

    • 这如何回应 OP 的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多