Activity
getBaseContext
这个函数的默认返回类型就是当前的Activity。
在启动流程的ActivityThread.class--performLaunchActivity()
中
appContext.setOuterContext(activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback,
r.assistToken);
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor,
Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
attachBaseContext(context);
...
}
这里直接通过attach方法调用了attachBaseContext
实现了base的赋值
但是这个值是可以被更改的
在Activity.class中
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
if (newBase != null) {
newBase.setAutofillClient(this);
newBase.setContentCaptureOptions(getContentCaptureOptions());
}
}
这个方法是可以被子类调用的。所以也不能完全认为baseContext
就是当前的activity。
不建议使用这中方式处理普通的context操作。可以用Activity.this 或者 getApplicationContext代替
getApplicationContext
返回的就是applicationContext
public Context getApplicationContext() {
return mBase.getApplicationContext();
}
Fragment
getContext()
getActivity()
这两个返回的是相同的都是actvity
在FragmentActivity
中创建 FragmentController
时就赋值了Context和Activity
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
......
public HostCallbacks() {
super(FragmentActivity.this /*fragmentActivity*/);
}
.......
//这里传入的两个参数都是activity
FragmentHostCallback(@NonNull FragmentActivity activity) {
this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
}
.......
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
@NonNull Handler handler, int windowAnimations) {
mActivity = activity;
mContext = Preconditions.checkNotNull(context, "context == null");
mHandler = Preconditions.checkNotNull(handler, "handler == null");
mWindowAnimations = windowAnimations;
}
在使用的时候我们可以使用requireContext
requireActivity
来获取 ,它们已经帮我们做了空检测