Mik*_*ike 2 android android-context android-activity
我刚刚在我的游戏中完成了几项活动,现在我开始将它们连接起来使用真实的游戏数据,而不是我用来确保每件作品的测试数据.由于多个活动需要访问此游戏数据,因此我开始研究将此数据传递给我的活动的最佳方法.
我知道将putExtra与intent一起使用,但我的GameData类有相当多的数据而不仅仅是简单的键值对.除了相当多的基本数据类型外,它还有大型数组.我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对.
我读了下面这篇文章,并认为这是要走的路,但到目前为止,我还没有开始工作.
我创建了一个简单的测试应用程序来尝试这个方法,但它一直崩溃,我的代码看起来与上面的帖子看起来一样 - 除了我更改名称.这是我得到的错误.有人能帮助我理解我做错了什么吗?
12-23 00:50:49.762:ERROR/AndroidRuntime(608):引起:java.lang.ClassCastException:android.app.Application
它在以下声明中崩溃:
GameData newGameData = ((GameData)getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
//我的主要活动
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);
}
}
Run Code Online (Sandbox Code Playgroud)
//我的测试活动,以查看它是否可以访问上次活动中的数据及其先前状态
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());
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的清单的相关部分:
<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>
Run Code Online (Sandbox Code Playgroud)
请帮我理解为什么这段代码会崩溃?
此外,如果您认为这只是让多个活动可以访问相同数据的错误方法,请提供您的建议.请记住,我正在谈论相当多的变量和一些大型数组.
我不确定,但我想你想把清单中的那些标签组合成一个标签,就像这样.(您可能还需要完整拼写应用程序的程序包名称,而不是使用initial .作为快捷方式.)
<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>
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我会避免使用GameData应用程序的名称和StaticGameData活动;这些让我觉得这StaticGameData将是一个子类GameData.)