如何防止通过意图将数据传递给多个活动?

时间:2017-08-10 11:40:45

标签: android android-intent android-activity

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

现在一种方法是通过C和D传递数据,最后在B中获取它但是我想知道是否有更好的方法来处理它?<​​/ p>

我想补充一点,数据可以是一个包含大量变量和数组的对象。

编辑: - 数据是活动B工作所必需的。

提前致谢。

5 个答案:

答案 0 :(得分:1)

使用SharedPreferrence;

用于存储值;

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

答案 1 :(得分:1)

你可以通过获取Bundle来检查你的Intent是否为null并且它具有Extras值,而另一个检查Bundle oBject是否为null然后检查Bundle对象中是否存在键。

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 在清单文件的活动B中使用singleTask launchMode。

android:launchMode="singleTask" 

答案 2 :(得分:1)

您可以使用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);

答案 3 :(得分:1)

如果传递的数据不同,则为变量(名为activity_name)分配调用intent的活动的名称。通过这种方式,您可以检查您是否从活动A或D来到活动B.

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

<强> ActivityA

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

<强> ActivityB

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使用相同的逻辑,如其他答案和评论中所述。

答案 4 :(得分:0)

在活动B中写下以下代码。

class Category(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category')
    description = models.TextField()

    def __str__(self):
        return self.name

    def clean(self):
        cleaned_data = super().clean()

        if not self.parent:
            exists = self.__class__.objects.filter(~Q(pk=self.pk), name__iexact=self.name).exists()
            if exists:
                raise ValidationError(_('Duplicate Category Name with No Parent'), code='duplicate_no_parent')
        if self.name.lower() == self.parent.name.lower():
            raise ValidationError(_('Category Name the same as Parent Category Name'), code='duplicate_as_parent')

        return cleaned_data