2

我刚刚在我的游戏中完成了一些活动,现在我将开始将它们连接起来以使用真实的游戏数据,而不是我用来确保每个部分都有效的测试数据。由于多个活动需要访问此游戏数据,我开始研究将这些数据传递给我的活动的最佳方式。

我知道将 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);
    }
}

// 我的测试 Activity 看它是否可以从上一个 Activity 访问数据及其之前的状态

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>

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

此外,如果您认为这只是让多个活动访问相同数据的错误方法,请提出您的建议。请记住,我说的是相当多的变量和一些大型数组。

4

3 回答 3

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将是 .)的子类GameData。)

于 2010-12-23T18:53:01.590 回答
2

不确定这是否可行,但请尝试使用 getApplication() 而不是 getApplicationContext()。

于 2010-12-23T18:06:15.087 回答
0

我还没有阅读整个故事,但是:我认为,如果自定义对象实现了 parcelable,则可以使用 putExtra 将自定义对象传递给意图。

于 2010-12-23T17:52:10.357 回答