Возникли проблемы при создании подкласса приложения для обмена данными с несколькими операциями

Я только что закончил пару действий в своей игре, и теперь я собирался соединить их обоих, чтобы использовать реальные игровые данные вместо тестовых данных, которые я использовал, просто чтобы убедиться, что каждая часть работала. Так как доступ к этим игровым данным понадобится нескольким группам действий, я начал искать лучший способ передачи этих данных в свои группы действий.

Я знаю об использовании 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.

Другие вопросы по тегам