インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります

あなたはこの記事から、これらの材料を得ることができます。

  • あなたは()setContentView後に何が起こったか知っていますか?
  • Androidのは、私たちが、画面上の画像を表示することを期待正確にどのように知っていますか?
  • Androidのは、ビューのアーキテクチャ全体の把握しています。
  • 分析は、元の画面カトンから学びます。
  • スムーズなアプリケーションのスキルを準備する方法を学びます。
  • Androidのソースコードから学ぶ上で反映されます。
  • 収穫2自作マップは、Androidのアーキテクチャの観点を理解するのに役立ちます。
    インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります
    setContentView()といえばから
public class AnalyzeViewFrameworkActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_analyze_view_framwork);
  }
}

おそらくAndroider上記のコード誰がほとんどできなくなりおなじみより。しかし、あなたはそのようなものがまだ書かれていた後何が起こったか知っていますか?私たちがしたところ、最終的にレイアウトが追加されますか?私の神は、知識が来ます!

多くの学生は、親のレイアウトのレイアウトを知っているDecorViewさんと呼ば置かれるかもしれないが、私はまだそれを再度言わなければなりません。私たちは、次の図を見てみましょう✌️

インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります
この図は、可能性があり、一般的な書籍やオンライン上のパートナーが同じではありません、なぜそれは同じではありませんか?私はそれを自分自身を描いているので、ハッハッハ...
ここでは図を見て、ストロークAndroidの基本的なビューフレームワークを撫でます。
PhoneWindowは、
多くの学生が活動のすべてのインスタンスは、Windowオブジェクトを持っていることを知っていると推定しています。この例では、実際にPhoneWindowタイプです。それは名前から見ることは容易であるPhoneWindowだから、それは窓(すなわちサブクラス)の息子でなければなりません!
知識ポイント:各活動はPhoneWindowがオブジェクトをしている
ので、PhoneWindowそれは何を使用ですか?それは活動としてどのような役割を行動するのでしょうか?ここで私は、ウィンドウにそれを呼び出すためにPhoneWindow同等と言うものとします。
インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります
ウィンドウは、文字通り、それは窓であるビットPCのような意味と概念上のウィンドウを参照してください。しかし、これは正確ではありません。図は語りました。私たちは、財産のレイアウトはこのmDecorでそのmDecorに配置されて表示する、見ることができますDecorViewの一例です。以下は現在のウィンドウの上に置く焦点を置き、ラインとDecorView専用されます。ウィンドウクラスのインスタンスを実装するウィンドウマネージャ(これはインターフェイスである)であり、より重要な属性mWindowManagerがあります。我々は通常getWindowManager()メソッドによって得られたものは、このmWindowManagerです。名前が示すように、それはウィンドウマネージャは、そのウィンドウ内に表示されるコンテンツを管理する責任があります。その実際の実装クラスはWindowManagerImplです。子供の靴は、おそらく今、このmWindowManagerにPhoneWindowを楽しみにしているインスタンス化された場合、このクラスを見つけるために、上下前後にロールされていませんがなくなっていますか?STOP!それが良いインスタンス化された場合mWindowManagerの父は、それです。以下はWindow.javaのコードです

public void setWindowManager(WindowManager wm, 
    IBinder appToken, 
    String appName, 
    boolean hardwareAccelerated) {
        ...
        if (wm == null) {
            wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            //获取了一个WindowManager
        }
        mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
        //通过这里我们可以知道,上面获取到的wm实际是WindowManagerImpl类型的。
    }

通过上面的介绍,我们已经知道了Window中有负责承载布局的DecorView,有负责管理的WindowManager(事实上它只是个代理,后面会讲它代理的是谁)。
DecorView
前面提到过,在Activity的onCreate()中通过setContentView()设置的布局实际是被放到DecorView中的。我们在图中找到DecorView。从图中可以看到,DecorView继承了FrameLayout,并且一般情况下,它会在先添加一个预设的布局。比如DecorCaptionView,它是从上到下放置自己的子布局的,相当于一个LinearLayout。通常它会有一个标题栏,然后有一个容纳内容的mContentRoot,这个布局的类型视情况而定。我们希望显示的布局就是放到了mContentRoot中。

知识点:通过setContentView()设置的布局是被放到DecorView中,DecorView是视图树的最顶层。

WindowManager
前面已经提到过,WindowManager在Window中具有很重要的作用。我们先在图中找到它。这里需要先说明一点,在PhoneWindow中的mWindowManager实际是WindowManagerImpl类型的。WindowManagerImpl自然就是接口WindowManager的一个实现类喽。这一点是我没有在图中反映的。WindowManager是在Activity执行attach()时被创建的,attach()方法是在onCreate()之前被调用的。
Activity.java

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){
        ...
        mWindow = new PhoneWindow(this, window);
        //创建Window
        ...
        mWindow.setWindowManager(
         (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
         mToken, mComponent.flattenToString(),
         (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
        //注意!这里就是在创建WindowManager。
        //这个方法在前面已经说过了。
        if (mParent != null) {
           mWindow.setContainer(mParent.getWindow());
        }
        mWindowManager = mWindow.getWindowManager();
            }

继续看图。WindowManagerImpl持有了PhoneWindow的引用,因此它可以对PhoneWindow进行管理。同时它还持有一个非常重要的引用mGlobal。这个mGlobal指向一个WindowManagerGlobal类型的单例对象,这个单例每个应用程序只有唯一的一个。在图中,我说明了WindowManagerGlobal维护了本应用程序内所有Window的DecorView,以及与每一个DecorView对应关联的ViewRootImpl。这也就是为什么我前面提到过,WindowManager只是一个代理,实际的管理功能是通过WindowManagerGlobal实现的。我们来看个源码的例子就比较清晰了。开始啦!
インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります
WimdowManagerImpl.java

public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    ...
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
    //实际是通过WindowManagerGlobal实现的。
}

从上面的代码可以看出,WindowManagerImpl确实只是WindowManagerGlobal的一个代理而已。同时,上面这个方法在整个Android的视图框架流程中十分的重要。我们知道,在Activity执行onResume()后界面就要开始渲染了。原因是在onResume()时,会调用WindowManager的addView()方法(实际最后调用的是WindowManagerGlobal的addView()方法),把视图添加到窗口上
ActivityThread.java

final void handleResumeActivity(IBinder token,
    boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
    ...
    ViewManager wm = a.getWindowManager();
    //获得WindowManager,实际是WindowManagerImpl
    ...
    wm.addView(decor, l);
    //添加视图
    ...
    wm.updateViewLayout(decor, l);
    //需要刷新的时候会走这里
    ...
}

从上面可以看到,当Activity执行onResume()的时候就会添加视图,或者刷新视图。需要解释一点:WindowManager实现了ViewManager接口。如图中所说,WindowManagerGlobal调用addView()的时候会把DecorView添加到它维护的数组中去,并且会创建另一个关键且极其重要的ViewRootImpl(这个必须要专门讲一下)类型的对象,并且也会把它存到一个数组中维护。WindowManagerGlobal.java

public void addView(View view, ViewGroup.LayoutParams params,
    Display display, Window parentWindow) {
    ...
    root = new ViewRootImpl(view.getContext(), display);
    //重要角色登场
    view.setLayoutParams(wparams);
    mViews.add(view);
    mRoots.add(root);
    //保存起来维护
    mParams.add(wparams);
    ...
    root.setView(view, wparams, panelParentView);
    //设置必要属性view是DecorView,panelParentView是PhoneWindow
    ...
}

ViewRootImplはonResume活動に実行されたときにそれを見ることができる()の作成のみであり、この時点でのみ、それがDecorView管理に渡すことができます。
知識ポイント:ウィンドウマネージャはのonCreateで(とき)に作成されます。実際のウィンドウを管理する能力はWindowManagerGlobalによって達成されます。onResume()内にそのビューがウィンドウマネージャによってウィンドウに追加されています。

ViewRootImpl

ViewRootImplは相互作用しWindowManagerServiceシステム、および描画とウィンドウ状態DecorViewを管理することができます。非常に重要。すぐにそれを描画に対応する位置を見つけて下さい!ビューではないViewRootImplが、管理ビューを担当しています。これは、ウィンドウのツリービューの管理システムで行われます。また、図からわかるように、DecorViewへの参照を保持しており、それが描かれたビューツリービューツリーの出発点です。したがって、ViewRootImpl少し複雑な、我々は図中に、理解することで、より深い必要は私をマークし、それは表面・振付家のより重要な要素である、など、後で説明します。これまでのところ、私たちは一緒に最初のグラフの線を入れて、再び、現在は子供用の靴ためのAndroidフレームワークのビューの一般的な理解を持っていました。以下は、さらにAndroidのメカニズムを理解するために描画します。

最後にアプリ常にカトン理由は何ですか?

我々が設定ビューが画面上にプロットすることができる理由を詳細に説明します、次の?これは、中央の種類の奇妙潜んでいるのですか?それを読んだ後、あなたは自然にあなたのアプリケーションは、カード、およびこれらのカトンに対処するためのアイデアを持つようになっただろう、なぜの根本原因を知ることができるようになります。
インタビュー]原因や最適化の提案のアプリケーションカトンの詳細な分析を持っている必要があります
また、マップを使用してプロセスを表示します。Androidのドローメカニズムは少し複雑なので、あなたの心がテン1万泥の馬をジャンプする可能性があるときに表示最初の事なので

おすすめ

転載: blog.51cto.com/14295695/2407445