使用应用程序 class 通过应用程序共享对象

Sharing objects through the app using the Application class

我正在尝试使用应用程序 class 定义全局对象。 因此,我定义了以下 class.

public class MyApplication extends Application {

    private MyObject myObject=new MyObject();

    public MyObject getMyObject(){
        return this.myObject;
    }
}

然后,我在 activity 中使用它,但出现错误(无法解析方法 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();
        }
    });

    }
}

我不知道为什么会出现此错误,因为它在另一个 activity.

中调用 getApplication() 时有效

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

更新

然后我执行 MyObject myObject=myApplication.getMyObject(); 并且我没有遇到任何编译问题但是应用程序在我进入 activity.

后立即死亡

据我了解,不建议将应用程序 class 用于此类用途,什么是更好的选择?

除非您有特定理由在 Android 中扩展应用程序 class,否则您可能不应该这样做。作为参考,请查看文档中的说明: https://developer.android.com/reference/android/app/Application.html

如果您尝试创建一个可以在 Android 应用中使用的对象,只需像在 Java 中那样做即可:

public class MyObject {
    //Your stuff here
}

如果您出于某种原因特别想扩展应用程序 class,那么如果您解释您正在尝试做什么,人们可能会为您提供更多帮助。根据您的示例,我只是不一定认为需要经历所有这些复杂性:)

this 更改为 AnActivity.this。 在下面的代码中,this 的含义从 AnActivity 变为 View.onClickListener,因为它是另一个对象,并且在这些大括号内,您处于点击侦听器 class[= 的范围内18=]

new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    }

所以上面的代码应该变成

new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)AnActivity.this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    }

你可以阅读更多关于它的内容here

您收到此错误是因为您在 View.OnClickListener 中调用了 this.getApplication()。因此,this 现在引用侦听器而不是 activity。

要执行您需要的操作,只需在 activity 的 onCreate 方法中的侦听器外部创建一个 Context 对象,然后将 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();
        }
    });

    }

}

问题更新后编辑:-

不使用应用程序class,而是使用static对象实现全局变量。 static 对象独立于对象,可以使用它们所属的class 来引用。例如,如果您在 MainActivity.class 中定义了一个 static 变量并将其命名为 testObject,那么无论您当前的 activity 是什么,都可以使用以下代码访问它:-

YourObject object = MainActivity.testObject;