Возникли проблемы при создании подкласса приложения для обмена данными с несколькими операциями
Я только что закончил пару действий в своей игре, и теперь я собирался соединить их обоих, чтобы использовать реальные игровые данные вместо тестовых данных, которые я использовал, просто чтобы убедиться, что каждая часть работала. Так как доступ к этим игровым данным понадобится нескольким группам действий, я начал искать лучший способ передачи этих данных в свои группы действий.
Я знаю об использовании putExtra с намерениями, но мой класс GameData содержит довольно много данных, а не только простые пары ключ-значение. Помимо нескольких основных типов данных, он также имеет большие массивы. Я действительно не хотел пытаться передать все это, если я не могу передать весь объект, а не просто пары ключ / данные.
Я прочитал следующий пост и подумал, что это будет путь, но до сих пор у меня не получилось.
Как объявить глобальные переменные в Android?
Я создал простое тестовое приложение, чтобы опробовать этот метод, но он продолжает падать, и мой код выглядит так же, как в посте выше - за исключением того, что я изменил имена. Вот ошибка, которую я получаю. Может ли кто-нибудь помочь мне понять, что я делаю неправильно?
12-23 00: 50: 49.762: ОШИБКА /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>
Пожалуйста, помогите мне понять, почему этот код не работает?
Кроме того, если вы считаете, что это неправильный подход, позволяющий нескольким действиям иметь доступ к одним и тем же данным, просьба высказать свое мнение. Пожалуйста, имейте в виду, что я имею в виду довольно много переменных и несколько больших массивов.
3 ответа
Я не уверен, но я думаю, что вы хотите объединить эти теги в манифесте в один тег, как это. (Вам также может понадобиться полностью прописать имя пакета вашего приложения вместо использования начального .
как ярлык.)
<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
будет подклассом GameData
.)
Не уверен, что это будет работать, но попробуйте использовать getApplication() вместо getApplicationContext().
Я еще не прочитал всю историю, но: я думаю, что вы можете передать свои намерения объектам с помощью putExtra, если они реализуют parcelable.