我有一个活动A,它通过Intent将数据传递给活动B.现在活动B调用活动C,活动C调用活动D.现在活动D调用活动B.现在活动B检查意图数据,但活动D没有传递任何数据。
现在一种方法是通过C和D传递数据,最后在B中获取它但是我想知道是否有更好的方法来处理它?</ p>
我想补充一点,数据可以是一个包含大量变量和数组的对象。
编辑: - 数据是活动B工作所必需的。
提前致谢。
答案 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