搜索
您的当前位置:首页正文

由view.getContext发现的知识点

来源:知库网

昨天在给一个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标志

Top