Context相关
Context是抽象类,位于content包下,是应用程序运行的上下文,提供程序需要的基础信息。
Interface to global information about an application environment. This is an abstract class whose implementation is provided bythe Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities,broadcasting and receiving intents, etc.
Context有两个子类,ContextWrapper,ContextImpl,ContextWrapper是Context的包装类,同时也是ContextThemeWrapper、Apllication、Service的父类。
ContextWrapper
ContextWrapper位于content包下,重写了Context的方法,部分委托实现一些功能。方便提供给子类调用。
class ContextWrapper extends Context {
public ContextWrapper(Context base) {
mBase = base;
}
public void startActivity(Intent intent, Bundle options) {
mBase.startActivity(intent, options);
}
......
}
ContextThemeWrapper
主要是设置主题相关,Activity继承当前类,可以设置主题信息。
public class ContextThemeWrapper extends ContextWrapper {
public void applyOverrideConfiguration(Configuration overrideConfiguration) {
if (mResources != null) {
throw new IllegalStateException(
"getResources() or getAssets() has already been called");
}
if (mOverrideConfiguration != null) {
throw new IllegalStateException("Override configuration has already been set");
}
mOverrideConfiguration = new Configuration(overrideConfiguration);
}
private void initializeTheme() {
final boolean first = mTheme == null;
if (first) {
mTheme = getResources().newTheme();
final Resources.Theme theme = getBaseContext().getTheme();
if (theme != null) {
mTheme.setTo(theme);
}
}
onApplyThemeResource(mTheme, mThemeResource, first);
}
}
Application
Application位于android.view包下,继承ContextWrapper,是全局应用生命周期,监听Activity生命周期。
class Application extends ContextWrapper implements ComponentCallbacks2 {
interface ActivityLifecycleCallbacks {...
interface OnProvideAssistDataListener {...
}
当应用程序第一次启动的时候,创建Application对象,在ActivityThread.java中,启动应用程序调用handleBindApplication()方法创建Application对象。
void handleBindApplication(AppBindData data) {
try {
final ApplicationInfo instrApp = new ApplicationInfo();
......
ContextImpl appContext = createBaseContextForActivity(r);
}
......
}
启动Activity是在performLaunchActivity()方法中,
Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
ContextImpl appContext = createBaseContextForActivity(r);
try {
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
}
......
}
Service
Service位于app包下,在handleCreateService()方法创建服务,
private void handleCreateService(CreateServiceData data) {
......
try {
ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
context.setOuterContext(service);
Application app = packageInfo.makeApplication(false, mInstrumentation);
service.attach(context, this, data.info.name, data.token, app,
ActivityManager.getService());
service.onCreate();
......
} catch (Exception e) {
}
}
ContextImpl
ContextImpl位于app包下,是Context的实现类,主要是实现Context具体功能,文件写入、发送广播、启动服务等一系列操作。
class ContextImpl extends Context {
......
public Resources getResources() {
return mResources;
}
@Override
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
@Override
public ContentResolver getContentResolver() {
return mContentResolver;
}
@Override
public Looper getMainLooper() {
return mMainThread.getLooper();
}
......
}
Context、Activity、Application区别及使用?
1、Context是抽象类,Activity、Application是Context子类。
2、单例模式下注意传入context生命周期是否是ApplicationContext,否则造成内存泄漏问题。
3、使用场景:
- 传入Activity的Context对象一般弹窗、跳转页面、启动绑定服务、发送广播、加载资源都是可以
- 传入Application和Service的Context,不能加载资源、弹窗、跳转;