将自定义对象从活动转移到具有活动上下文的活动?

时间:2015-07-18 22:35:23

标签: java android android-intent android-activity serialization

问题有点复杂,首先,活动A和活动B活动B在清单中都有android:noHistory = true。我有一个自定义可序列化类假设 MyClass ,该自定义类实际上是通过构造函数存储活动B 的上下文。我在 MyClass 类型的活动B中有一个对象名称 obj ,现在我想在活动C 在活动B 中按下了按钮。

从活动A有一个按钮,打开活动B没有问题,当我尝试在 onBackPressed()中打开活动C到B时,问题开始,并传输可序列化对象。我在活动C中收到 NULL

[更新] MyClass:

@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;
   }
}

活动B:

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

活动C:

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中成功接收我的自定义类?请帮忙

3 个答案:

答案 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