昨天在给一个RecycleView的item设置 OnClickListener的时候由于需要获取RecycleView所在的activity来调用startActivity方法,我直接使用item的getContext方法获取所在的activity引用。但是发现获得的是Application的引用,经过查看源代码和试验发现在setContentView里放置的view获得的是acitivity的引用,但是在RecyclerView的item中获得的的context引用是一个继承Application的类的引用。需要通过item的getParent获得RecyclerView的引用,再去调用getContext
在搜素过程中又学习到一个小知识点:由于Application类和Service类都是继承ContenxtWrapper,利用这两个Context启动activity的时候是使用ContenxtWrapper类的startActivity方法,这个方法内部通过委托模式调用ContextImpl的startActivity,这个方法源码
@Override
public voidstartActivity(Intent intent,Bundle options) {
warnIfCallingFromSystemProcess();
if((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) ==0) {
throw newAndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+" context requires the FLAG_ACTIVITY_NEW_TASK flag."
+" Is this really what you want?");
}
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(),mMainThread.getApplicationThread(), null,
(Activity)null,intent,-1,options);
}
即会检查intent的ACTIVITY_FLAG_NEW_TASK标志,进一步调用Instrumentation的execStartActivity来启动activity
而activity类重写了startactivity->startActivityForResult,直接调用Instrumentation的execStartActivity,没有检查Itent的ACTIVITY_FLAG_NEW_TASK标志