问题有点复杂,首先,活动A和活动B活动B在清单中都有android:noHistory = true
。我有一个自定义可序列化类假设 MyClass ,该自定义类实际上是通过构造函数存储活动B 的上下文。我在 MyClass 类型的活动B中有一个对象名称 obj ,现在我想在活动C 在活动B 中按下了
从活动A有一个按钮,打开活动B没有问题,当我尝试在 onBackPressed()中打开活动C到B时,问题开始,并传输可序列化对象。我在活动C中收到 NULL 。
@SuppressWarnings("serial")
public class MyClass implements Serializable{
private final String SHAREDKEY_HIGHSCORE = "High Scores";
private final String FIELDKEY_HIGHSCORE = "HighScore";
private final String FIELDKEY_HIGHTIME = "HighTime";
private SharedPreferences sp;
private SharedPreferences.Editor spEditor;
public MyClass(Context context) {
resetScore();
sp = context.getSharedPreferences(SHAREDKEY_HIGHSCORE, Context.MODE_PRIVATE);
spEditor = sp.edit();
}
public void resetScore(){
newTime = 0;
newScore = 0;
highTime = 0;
highScore = 0;
}
}
public class ActivityB extends Activity {
MyClass scores;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
scores = new MyClass(this);
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this, ActivityC.class);
in.putExtra("Scores", scores);
startActivity(intent);
}
}
public class ActivityC extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
MyClass score = (MyClass) getIntent().getSerializableExtra("Scores");
//score is null here always
}
}
<activity
android:name=".ActivityA"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityB"
android:noHistory="true">
</activity>
<activity android:name=".ActivityC">
如何在活动C中成功接收我的自定义类?请帮忙
答案 0 :(得分:1)
问题显然在// i have to store context of Activity B no matter what
。
NO!您不必存储活动B的上下文。您正在尝试这样做,原因是错误的。
在Android中,您绝不能尝试将活动保留的时间超过其生命周期,并且绝不应尝试序列化Context
。它只是不起作用,这就是它不起作用的原因。
我把这作为一个答案(而不是评论),因为那是什么。
您的问题的解决方案是:重新考虑您应用的架构。有几种不同的正确方法可以通过活动传递或共享信息,但是尝试保持上下文并将其序列化,并不是其中之一。
答案 1 :(得分:0)
根据Android文档,当您使用noHistory
声明活动时,它不会保留在活动堆栈中。
在onBackPressed
完成后,您的问题就出现了。您的Activity B
上下文由Android OS GC清理,因此当创建活动C时,您必须指向该上下文的指针指向空位置。
我建议使用其他架构在您的活动之间传递信息。尝试搜索&#34; Android扩展应用程序类&#34;在谷歌:)
答案 2 :(得分:0)
我不知道你想要实现什么,但是存储一些Activity
的上下文不会让你到那里。正如@Budius所说,你应该重新思考你想要做的事情。文档说明了Context
:
有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等。
我没有看到为什么需要保留和序列化它的任何原因。即使您需要“全局”背景信息,也可以随时在getApplication()
内拨打Activity
。