使用Application类通过应用程序共享对象

Rob*_*bin 0 java mobile android global android-activity

我试图使用应用程序类定义全局对象.因此,我定义了以下类.

public class MyApplication extends Application {

    private MyObject myObject=new MyObject();

    public MyObject getMyObject(){
        return this.myObject;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在一个活动中使用它,但是我收到一个错误(无法解析方法getApplication()):

public class AnActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mood);

    Button buttonMusic=(Button) findViewById(R.id.button5);
    buttonMusic.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    });

    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我会收到此错误,因为例如在另一个活动中调用getApplication()时它会起作用.

我对Android和Java很陌生,所以请原谅这个问题的独创性.

UPDATE

然后我做了MyObject myObject=myApplication.getMyObject();,我没有得到任何编译问题,但应用程序在我进入该活动后立即死亡.

据我所知,不建议使用Application类进行此类使用,那么什么是一个好的替代方案呢?

Roh*_*ark 5

你收到这个错误,因为你this.getApplication()在里面打电话View.OnClickListener.因此,this现在引用侦听器而不是活动.

要做你需要的,只需Context在你的activity的onCreate方法中创建一个侦听器之外的对象并分配this给它.而且,在听众中,使用context而不是this.像这样: -

public class AnActivity extends Activity {
    Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mood);
    context = this;
    Button buttonMusic=(Button) findViewById(R.id.button5);
    buttonMusic.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)context.getApplication());//Changed "the" to "context"
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    });

    }

}
Run Code Online (Sandbox Code Playgroud)

问题更新后编辑: -

而不是使用应用程序类,使用static对象来实现全局变量.static对象独立于对象,可以使用它们所属的类进行引用.例如,如果您在其中定义static变量MainActivity.class并为其命名testObject,则无论您当前的活动如何,都可以使用以下代码访问该变量: -

YourObject object = MainActivity.testObject;
Run Code Online (Sandbox Code Playgroud)