【问题标题】:Transfer an custom object from activity to activity with activity context?使用活动上下文将自定义对象从活动转移到活动?
【发布时间】:2015-07-18 22:35:22
【问题描述】:

问题有点复杂,首先活动 A 和活动 B 活动 B 在清单中都有 android:noHistory = true。我有一个自定义 serializable 类假设 MyClass ,该自定义类实际上是通过构造函数存储 Activity B 的上下文。我在 MyClass 类型的 Activity B 中有一个对象名称 obj ,现在我想在 时通过意图将此对象转移到 Activity C >返回按钮在Activity B中被按下。

从活动 A 有一个按钮可以毫无问题地打开活动 B,当我尝试在 onBackPressed() 中通过 B 打开活动 C 并传输可序列化对象时,问题就开始了。我在活动 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;
   }
}

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

【问题讨论】:

  • 我不确定这是否能解决问题,但根据 putExtra() 上的文档,额外名称必须包含包名称作为前缀。
  • @MichaelAaronSafyan 不,这不是必需的。

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


【解决方案1】:

问题显然出在// i have to store context of Activity B no matter what

不!您不必存储 Activity B 的上下文。您尝试这样做是出于错误的原因。

在 Android 中,您绝不能尝试将 Activity 保留的时间超过其生命周期,并且您绝不能尝试序列化 Context。它只是不能这样工作,这就是它不能工作的原因。

我将其作为答案(而不是评论),因为事实就是如此。

解决问题的方法是:重新考虑应用的架构。通过活动传递或共享信息有几种不同的正确方法,但尝试保持上下文并将其序列化并不是其中之一。

【讨论】:

  • 为了争论,只需替换这一行 score = new MyClass(this);具有此分数的活动 B = new MyClass(getApplicationContext());仍然,问题是一样的,现在更糟糕的是,我得到了异常
  • “MyClass”不需要有上下文对象。放手吧。 Context是系统自己提供给你的。为什么要保留它?
  • 实际上我正在 MyClass 中使用 sharedpreferences 进行一些操作,所以我需要应用程序或活动的上下文来实现这一点。
  • 如果您要做的只是访问sharedpreferences,那么您的问题比这简单得多。只需对应用程序进行自我引用,并在您需要的时候使用它。请参考这个答案来了解如何实现它:stackoverflow.com/a/14057777/906362
  • Lol @Budius 到那时我访问了 C 中 Activity B 的 MyClass 对象中的任何内容,Activity B 已经被销毁了。
【解决方案2】:

根据 Android 文档,当您使用noHistory 声明一个 Activity 时,它不会留在 Activity Stack 中。

您的问题在您的onBackPressed 完成后发生。您的 Activity B 上下文由 Android OS GC 清理,因此在创建 Activity C 时,您必须指向该上下文的指针指向一个空位置。

我建议使用另一种架构在您的活动之间传递信息。尝试在 google 中搜索“Android 扩展应用程序类”:)

【讨论】:

  • 我知道,但我的问题不仅在于上下文,还在于自定义类的序列化。
  • 我给了你正确的方法!在扩展Activity 的类中存储变量是在活动之间存储值的好习惯。在 SO 上搜索。
  • 问题没那么简单,你看看我更新的MyClass
  • 我的回答还是解决了你的问题。显然,您没有考虑扩展 Application 对象以在应用程序中的活动/片段之间传输值。你真的应该阅读它。
【解决方案3】:

我不知道你想要实现什么,但存储一些 Activity 的上下文不会让你到达那里。正如@Budius 所说,你应该重新考虑你想要做什么。文档说Context

有关应用程序环境的全局信息的接口。这是一个抽象类其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及向上调用应用程序级操作,例如启动活动、广播和接收意图等。

我看不出有什么理由需要保留和序列化它。即使您需要“全局”上下文,您也可以随时在您的Activity 中调用getApplication()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多