ibinder,androidwidgetframelayout怎么解决
ibinder,androidwidgetframelayout怎么解决
正文
文章目录
- ibinderandroidwidgetframelayout怎么解决?
ibinderandroidwidgetframelayout怎么解决?
我想大多数人对于这3个东西的概念能区分但是具体区别在哪却很难说出来。 我这里根据我个人的理解来讲讲我个人对这3个概念的理解。当然这里设计到通用的事件窗口模型等通用GUI设计我这里就不打算讲了纯粹从概念上来进行区分。 Activity是Android应用程序的载体允许用户在其上创建一个用户界面并提供用户处理事件的API如onKeyEvent, onTouchEvent等。 并维护应用程序的生命周期(由于android应用程序的运行环境和其他操作系统不同android的应用程序是运行在框架之内所以他的应用程序不能当当从进程的级别去考虑而更多是从概念上去考虑。android应用程序是由多个活动堆积而成而各个活动又有其独立的生命周期)。Activity本身是个庞大的载体可以理解成是应用程序的载体如果木有Activity,android应用将无法运行。也可以理解成android应用程序的入口。Acivity的实例对象由系统维护。系统服务ActivityManager负责维护Activity的实例对象并根据运行状态维护其状态信息。 但在用户级别程序员可能根愿意理解成为一个界面的载体。但仅仅是个载体它本身并不负责任何绘制。Activity的内部实现实际上是聚了一个Window对象。Window是一个抽象类它的具体是在android_src_home/framework/policies/base/phone/com/android/internal/policy/impl目录下的PhoneWindow.java。 当我们调用Acitivity的 setContentView方法的时候实际上是调用的Window对象的setContentView方法所以我们可以看出Activity中关于界面的绘制实际上全是交给Window对象来做的。绘制类图的话可以看出Activity聚合了一个Window对象。 下面是PhoneWindow中的setContentView方法的实现: @Override public void setContentView(View view, ViewGroup.LayoutParams params) { if (mContentParent == null) { installDecor(); } else { mContentParent.removeAllViews(); } mContentParent.addView(view, params); final Callback cb = getCallback(); if (cb != null) { cb.onContentChanged(); } } Window内部首先判断mContentParent是否为空然后调用installDecor方法(安装装饰器)我们看看这个方法如何实现的 private void installDecor() { if (mDecor == null) { mDecor = generateDecor(); mDecor.setIsRootNamespace(true); } if (mContentParent == null) { mContentParent = generateLayout(mDecor); mTitleView = (TextView)findViewById(com.android.internal.R.id.title); if (mTitleView != null) { if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) { View titleContainer = findViewById(com.android.internal.R.id.title_container); if (titleContainer != null) { titleContainer.setVisibility(View.GONE); } else { mTitleView.setVisibility(View.GONE); } if (mContentParent instanceof FrameLayout) { ((FrameLayout)mContentParent).setForeground(null); } } else { mTitleView.setText(mTitle); } } } } 在该方法中首先创建一个DecorView,DecorView是一个扩张FrameLayout的类是所有窗口的根View。我们在Activity中调用的setConctentView就是放到DecorView中了。这是我们类图的聚合关系如下: Activity--->Window--->DecorView 这是我们得出这3个类之间安防直接的一个关系。 我们详细分析一下类对象是如何被创建的。 先不考虑Activity的创建(因为 Acitivity的实例由ActivityManager维护是在另一个进程设计到IPC的通信后面会讲到)而考虑Window和View的创建。 Activity被创建后系统会调用它的attach方法来将Activity添加到ActivityThread当中。我们找到Activity的attach方法如下: 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, Object lastNonConfigurationInstance, HashMap<String,Object> lastNonConfigurationChildInstances, Configuration config) { attachBaseContext(context); mWindow= PolicyManager.makeNewWindow(this); mWindow.setCallback(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); } mUiThread = Thread.currentThread(); mMainThread = aThread; mInstrumentation = instr; mToken = token; mIdent = ident; mApplication = application; mIntent = intent; mComponent = intent.getComponent(); mActivityInfo = info; mTitle = title; mParent = parent; mEmbeddedID = id; mLastNonConfigurationInstance = lastNonConfigurationInstance; mLastNonConfigurationChildInstances = lastNonConfigurationChildInstances; mWindow.setWindowManager(null, mToken, mComponent.flattenToString()); if (mParent != null) { mWindow.setContainer(mParent.getWindow()); } mWindowManager = mWindow.getWindowManager(); mCurrentConfig = config; } 我们看红色的代码部分就是创建Window对象的代码。感兴趣的同学可以跟踪去看看具体是如何创建的。其实很简单其内部实现调用了Policy对象的makeNewWindow方法其方法直接new了一个PhoneWindow对象如下: public PhoneWindow makeNewWindow(Context context) { return new PhoneWindow(context); } 这时我们已经可以把流程串起来Activity创建后系统会调用其attach方法将其添加到ActivityThread当中在attach方法中创建了一个window对象。 下面分析View的创建。我们知道Window聚合了DocerView,当用户调用setContentView的时候会把一颗View树仍给DocerView.View树是已经创建好的实例对象了所以我们研究的是DocerView是个什么东西它是如何被创建的。 我们回头看看Window实现里边的setContentView方法我们看上面代码的红色部分setContentView-> installDecor-> generateDecor. generateDecor直接new了一个DecorView对象: protected DecorView generateDecor() { return new DecorView(getContext(), -1); } 我们可以去看看DecorView的实现它是PhoneWindow的一个内部类。实现很简单它默认会包含一个灰色的标题栏然后在标题栏下边会包含一个空白区域用来当用户调用setContentView的时候放置用户View并传递事件这里不做详细分析感兴趣同学可以自己研究研究。 当DecorView创建好之后再回到Window中的setContentView方法中来见上面代码蓝色部分调用 mContentParent.addView(view, params); 来将用户的View树添加到DecorView中。 到这时为止我想我们已经很清晰的认识到它们3者之间的关系并知道其创建流程。 现在总结一下: Activity在onCreate之前调用attach方法在attach方法中会创建window对象。window对象创建时并木有创建Decor对象对象。用户在Activity中调用setContentView,然后调用window的setContentView这时会检查DecorView是否存在如果不存在则创建DecorView对象然后把用户自己的View 添加到DecorView中。
返回:安防新闻
广告咨询:18215288822 采购热线:18215288822
声明:农机大全所有(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者。若您的权利被侵害,请联系 56325386@qq.com 删除。
载注明出处:http://nongjidaquan.com/news/293238.html
