使用活动上下文从一个活动传输一个自定义对象到另一个活动?
使用活动上下文从一个活动传输一个自定义对象到另一个活动?
问题有点复杂。首先,活动A和活动B在清单文件中都有android:noHistory = true
。我有一个自定义的可序列化类,叫做MyClass,这个自定义类实际上通过构造函数存储了活动B的上下文。在活动B中,我有一个名为obj的MyClass类型的对象。现在,当在活动B中按下返回按钮时,我想通过意图将这个对象传递给活动C。从活动A中,有一个按钮可以打开活动B,没有任何问题,但当我尝试在onBackPressed()中通过B打开C时,同时传递可序列化对象,我在活动C中收到了NULL。\n
[更新] MyClass:
\n
@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; } }
\n
活动B:
\n
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); } }
\n
活动C:
\n
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总是为空 } }
\n
清单文件:
\n
\n请问如何成功地在活动C中接收到我的自定义类?请帮忙。
在Android开发中,我们经常需要在不同的Activity之间传递数据。然而,在某些情况下,我们可能会遇到一些问题,例如在一个Activity中将自定义对象传递给另一个Activity时遇到了上下文(context)丢失的问题。
根据Android文档的描述,当我们在Activity中使用noHistory
属性时,该Activity不会保留在Activities Stack中。这就意味着当我们从Activity A跳转到Activity B时,Activity A的上下文将被系统垃圾回收,当我们再次返回到Activity A时,我们无法获取到Activity A的上下文。
在这种情况下,我们可以考虑使用其他的架构来解决Activity之间数据传递的问题。一个常见的解决方案是通过扩展Application类来存储数据,并在需要的地方进行访问。通过在Google上搜索"Android extending Application class",我们可以找到相关的教程和示例代码。
然而,在这个问题中,问题不仅仅是上下文的丢失,还涉及到自定义类的序列化问题。根据问题描述,我们可以看到作者尝试将自定义类MyClass传递给另一个Activity,但遇到了序列化的问题。
尽管有这些问题,我们仍然可以使用上述提到的解决方案来解决。通过扩展Application类,并将自定义类MyClass的实例作为全局变量存储在该类中,我们可以在不同的Activity中访问和传递该类的实例。
虽然有人可能会认为这个解决方案过于简单,但根据问题描述,这是解决该问题的可行方法。通过扩展Application类来存储数据并在需要的地方进行访问,可以有效地解决Activity之间数据传递的问题。建议作者在Stack Overflow或其他相关论坛上搜索相关问题,以获取更多的解决方案和建议。
当我们在Android开发中遇到将自定义对象从一个Activity传递到另一个Activity的问题时,可能会遇到上下文丢失和序列化的问题。为了解决这些问题,我们可以考虑使用扩展Application类的方法来存储和传递数据。请注意,这里只是提供了一种解决方案,根据实际情况可能还有其他更适合的解决方案。
从上述内容中可以看出,问题的原因是尝试将一个自定义对象从一个活动传递到另一个活动,并尝试存储活动B的上下文。然而,在Android中,不应该尝试保持一个活动超过其生命周期,并且不应该序列化一个上下文对象。这样做是行不通的原因。
解决这个问题的方法是重新思考应用程序的架构。有几种不同的正确方式可以在活动之间传递或共享信息,但是试图保持上下文并序列化它不是其中之一。
如果只是想访问sharedpreferences,那么问题会简单得多。只需要在需要的时候创建一个Application的自引用,并使用它。可以参考这个答案了解如何实现:stackoverflow.com/a/14057777/906362
另外,不应该尝试在活动的生命周期之外访问上下文。这是因为在答案中提到的方法只是保持Application的引用,而不是活动的引用。同时,作者指出自己是一名具有10多万次下载和16K声望的顶级开发者,试图指导问题的解决方向。
如果修改项目中的其他文件太困难,那么访问sharedpreferences就会变得困难,因为它是系统的一部分,需要访问系统,就需要上下文。如果想在活动生命周期之外访问上下文,就必须修改其他文件。在链接的答案中,MyClass只需要调用:App.get().getSharedPreferences("name", 0)就可以访问sharedpreferences。