我刚刚在我的游戏中完成了几项活动,现在我开始将它们连接起来使用真实的游戏数据,而不是我用来确保每件作品的测试数据。由于多个活动需要访问此游戏数据,因此我开始研究将此数据传递给我的活动的最佳方式。
我知道将putExtra与intent一起使用,但我的GameData类有相当多的数据而不仅仅是简单的键值对。除了相当多的基本数据类型外,它还有大型数组。我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对。
我阅读了以下帖子,并认为这是可行的方法,但到目前为止,我还没有让它发挥作用。
How to declare global variables in Android?
我创建了一个简单的测试应用程序来尝试这种方法,但它不断崩溃,我的代码看起来与上面的帖子看起来一样 - 除了我更改了名称。这是我得到的错误。有人能帮助我理解我做错了吗?
12-23 00:50:49.762:ERROR / AndroidRuntime(608):引起:java.lang.ClassCastException:android.app.Application
它在以下声明中崩溃:
GameData newGameData = ((GameData)getApplicationContext());
这是我的代码:
package mrk.examples.MainActivity;
import android.app.Application;
public class GameData extends Application {
private int intTest;
GameData () {
intTest = 0;
}
public int getIntTest(){
return intTest;
}
public void setIntTest(int value){
intTest = value;
}
}
//我的主要活动
package mrk.examples.MainActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
int intLocal;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GameData newGameData = ((GameData) getApplicationContext());
newGameData.setIntTest(0);
intLocal = newGameData.getIntTest();
Log.d("MainActivity", "IntLocal = " + intLocal);
newGameData.setIntTest(1);
Log.d("MainActivity", "IntLocal = " + intLocal
+ " newGameData IntTest: " + newGameData.getIntTest());
Intent intentNew = new Intent(this, PassData2Activity.class);
startActivity(intentNew);
}
}
//我的测试活动,以查看它是否可以访问上次活动中的数据及其先前状态
package mrk.examples.MainActivity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class PassData2Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GameData gamedataPass = ((GameData)getApplicationContext());
Log.d("PassData2Activity", "gamedatapass IntTest = " +
gamedataPass.getIntTest());
}
}
以下是我的清单的相关部分:
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".PassData2Activity"></activity>
</application>
<application android:name=".GameData"
android:icon="@drawable/icon"
android:label="@string/app_name">
</application>
请帮我理解为什么这段代码会崩溃?
此外,如果您认为这只是让多个活动可以访问相同数据的错误方法,请提供您的建议。请记住,我说的是很多变量和一些大型数组。
答案 0 :(得分:7)
我不确定,但我认为您希望将清单中的标签组合成单个标签,就像这样。 (您可能还需要完整拼出应用的包名,而不是使用初始.
作为快捷方式。)
<application android:icon="@drawable/icon"
android:name=".GameData"
android:label="@string/app_name">
<activity android:name=".StaticGameData"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".PassData2Activity"></activity>
</application>
(顺便说一句,我会避免使用名称GameData
作为应用程序,StaticGameData
作为活动;这些让我觉得StaticGameData
将是{的子类{1}}。)
答案 1 :(得分:2)
不确定这会有效,但请尝试使用getApplication()而不是getApplicationContext()。
答案 2 :(得分:0)
我还没有阅读整个故事,但是:我认为,如果他们实现了parcelable,你可以使用putExtra将自定义对象传递给intent。