无法创建应用程序的子类以与多个活动共享数据

Mik*_*ike 2 android android-context android-activity

我刚刚在我的游戏中完成了几项活动,现在我开始将它们连接起来使用真实的游戏数据,而不是我用来确保每件作品的测试数据.由于多个活动需要访问此游戏数据,因此我开始研究将此数据传递给我的活动的最佳方法.

我知道将putExtra与intent一起使用,但我的GameData类有相当多的数据而不仅仅是简单的键值对.除了相当多的基本数据类型外,它还有大型数组.我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对.

我读了下面这篇文章,并认为这是要走的路,但到目前为止,我还没有开始工作.

如何在Android中声明全局变量?

我创建了一个简单的测试应用程序来尝试这个方法,但它一直崩溃,我的代码看起来与上面的帖子看起来一样 - 除了我更改名称.这是我得到的错误.有人能帮助我理解我做错了什么吗?

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)

请帮我理解为什么这段代码会崩溃?

此外,如果您认为这只是让多个活动可以访问相同数据的错误方法,请提供您的建议.请记住,我正在谈论相当多的变量和一些大型数组.

Dan*_*lau 7

我不确定,但我想你想把清单中的那些标签组合成一个标签,就像这样.(您可能还需要完整拼写应用程序的程序包名称,而不是使用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.)