使用活动上下文从一个活动传输一个自定义对象到另一个活动?

11 浏览
0 Comments

使用活动上下文从一个活动传输一个自定义对象到另一个活动?

问题有点复杂。首先,活动A和活动B在清单文件中都有android:noHistory = true。我有一个自定义的可序列化类,叫做MyClass,这个自定义类实际上通过构造函数存储了活动B的上下文。在活动B中,我有一个名为objMyClass类型的对象。现在,当在活动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 \n \n \n \n\n\n\n\n\n请问如何成功地在活动C中接收到我的自定义类?请帮忙。

0
0 Comments

问题的出现原因是有人试图将一个自定义对象从一个活动传递到另一个活动,并且希望使用活动的上下文来实现这个功能。然而,存储活动的上下文并不能达到这个目的。

解决方法是重新思考要实现的目标。根据文档,上下文(Context)是一个提供给Android系统使用的抽象类,用于访问应用程序特定的资源和类,以及进行应用程序级别的操作,例如启动活动、广播和接收意图等。因此,并没有任何理由需要保留和序列化上下文对象。即使需要一个“全局”的上下文,也可以在活动中调用getApplication()来获取。

简而言之,将自定义对象从一个活动传递到另一个活动时,不需要存储和传递活动的上下文。

0
0 Comments

在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类的方法来存储和传递数据。请注意,这里只是提供了一种解决方案,根据实际情况可能还有其他更适合的解决方案。

0
0 Comments

从上述内容中可以看出,问题的原因是尝试将一个自定义对象从一个活动传递到另一个活动,并尝试存储活动B的上下文。然而,在Android中,不应该尝试保持一个活动超过其生命周期,并且不应该序列化一个上下文对象。这样做是行不通的原因。

解决这个问题的方法是重新思考应用程序的架构。有几种不同的正确方式可以在活动之间传递或共享信息,但是试图保持上下文并序列化它不是其中之一。

如果只是想访问sharedpreferences,那么问题会简单得多。只需要在需要的时候创建一个Application的自引用,并使用它。可以参考这个答案了解如何实现:stackoverflow.com/a/14057777/906362

另外,不应该尝试在活动的生命周期之外访问上下文。这是因为在答案中提到的方法只是保持Application的引用,而不是活动的引用。同时,作者指出自己是一名具有10多万次下载和16K声望的顶级开发者,试图指导问题的解决方向。

如果修改项目中的其他文件太困难,那么访问sharedpreferences就会变得困难,因为它是系统的一部分,需要访问系统,就需要上下文。如果想在活动生命周期之外访问上下文,就必须修改其他文件。在链接的答案中,MyClass只需要调用:App.get().getSharedPreferences("name", 0)就可以访问sharedpreferences。

0