如何获取我的活动背景?

Ofe*_*Ron 64 android android-context

我真的不明白这整个事情是如何工作的,所以如果我有一些类A需要B扩展的类的上下文,Activity我该如何获得该上下文?

我正在寻找一种比将上下文作为类A构造函数的参数更有效的方法.例如,如果类A将有数百万个实例,那么我们最终会有数百万个冗余指针,Context而我们应该能够以某种方式只有一个地方和一个getter函数......

Gan*_*Gan 48

好的,我将举例说明如何做你要求的

public class ClassB extends Activity
{

 ClassA A1 = new ClassA(this); // for activity context

 ClassA A2 = new ClassA(getApplicationContext());  // for application context. 

}
Run Code Online (Sandbox Code Playgroud)


has*_*ian 37

你可以使用Applicationclass(android.application包中的public class),即:

需要维护全局应用程序状态的基类.您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的过程时为您实例化该类.

要使用这个类做:

public class App extends Application {

    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    public static void setContext(Context mContext) {
        this.mContext = mContext;
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

在你的清单中:

<application
        android:icon="..."
        android:label="..."
        android:name="com.example.yourmainpackagename.App" >
                       class that extends Application ^^^
Run Code Online (Sandbox Code Playgroud)

在活动B中:

public class B extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sampleactivitylayout);

        App.setContext(this);
                  ...
        }
...
}
Run Code Online (Sandbox Code Playgroud)

在A班:

Context c = App.getContext();
Run Code Online (Sandbox Code Playgroud)

注意:

通常不需要子类Application.在大多数情况下,静态单例可以以更模块化的方式提供相同的功能.如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext().

  • 我可以问为什么需要实现OnInitListener? (4认同)
  • 将上下文保持为静态可能会导致Android中的内存泄漏. (2认同)

Joh*_*tts 29

获取活动上下文的最佳和最简单的方法是放置活动.this的名称.例如:如果您的活动名称是SecondActivity,则其上下文将是SecondActivity.this