我并没有真正理解整个事情是如何工作的,因此,如果我有一些A
需要B
扩展的类的上下文的类,Activity
我如何获得该上下文?
我正在寻找一种比将上下文作为类A
构造函数的参数更有效的方法。例如,如果类A
将具有数百万个实例,那么我们最终将具有数以百万计的冗余指针,Context
而我们应该能够以某种方式仅在某个地方放置一个getter函数。
我并没有真正理解整个事情是如何工作的,因此,如果我有一些A
需要B
扩展的类的上下文的类,Activity
我如何获得该上下文?
我正在寻找一种比将上下文作为类A
构造函数的参数更有效的方法。例如,如果类A
将具有数百万个实例,那么我们最终将具有数以百万计的冗余指针,Context
而我们应该能够以某种方式仅在某个地方放置一个getter函数。
Answers:
您可以使用Application
class(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;
}
...
}
在您的清单中:
<application
android:icon="..."
android:label="..."
android:name="com.example.yourmainpackagename.App" >
class that extends Application ^^^
在活动B中:
public class B extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sampleactivitylayout);
App.setContext(this);
...
}
...
}
在A类中:
Context c = App.getContext();
注意事项:
通常不需要子类化Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单身人士需要全局上下文(例如,注册广播接收者),则可以为该函数提供一个上下文,该上下文在首次构造单身人士时在内部使用Context.getApplicationContext()。
MainActivity
),因此您可以将静态Context
成员放入该类中。(仅仅是因为您已经创建了该自定义类,所以不需要再创建另一个类,App。)另一方面,将App
与无关的东西放进去显然更清晰MainActivity
。
OnInitListener
那是贴花的TextToSpeech.OnInitListener
?
获取活动上下文的最佳和简便方法是在“活动”.this
的名称后面加上。例如:如果您的活动名称为SecondActivity
,则其上下文将为SecondActivity.this
您将上下文传递给其构造函数中的类B,并确保传递getApplicationContext()而不是activityContext()
Context
则应用程序上下文或活动上下文都将起作用。但是,如果通过上下文传递的类是可能与UI相关的工作的“帮助程序”类,则ctx.getWindowManager()
(例如)如果ctx
引用了应用程序上下文,则将不是有效的方法调用。换句话说,它实际上取决于为什么需要向类传递“上下文”以及它需要什么。
您可以使用类A的参数Context创建一个构造函数,然后可以使用此上下文。
上下文c;
A(上下文上下文){this.c = context}
在B活动中,使用此构造函数并传递getApplicationContext()创建类A的对象。
在Kotlin将是:
activity?.applicationContext?.let {
it//<- you context
}