3

我想知道什麼Activity.javasetContentView()方法正在調用/正在做什麼。Android源代碼,Java跟蹤,抽象類

Here是Android源代碼,並在1646行的代碼存根:

public void setContentView(int layoutResID) { 
    getWindow().setContentView(layoutResID); 
} 

這裏是我的痕跡......

在電線642,我們知道它的類型爲android.view.Window

private Window mWindow; 

但是Window.java是一個抽象類。而在線路738,方法是抽象的也是:

public abstract void setContentView(int layoutResID); 

哪裏實際函數體中實現?

回到Activity.java文件,在線3746,我們發現mWindow一些初始化:

mWindow = PolicyManager.makeNewWindow(this); 
mWindow.setCallback(this); 
... 

嗯,是關於com.android.internal.policy.PolicyManagermakeNewWindow()

public static Window makeNewWindow(Context context) { 
    return sPolicy.makeNewWindow(context); 
} 

private static final IPolicy sPolicy; 
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); 
sPolicy = (IPolicy)policyClass.newInstance(); 

IPolicy.java是一個接口,這意味着根本沒有實現。

我的蹤跡不能再進一步。你能幫我解決嗎?

特別是,我知道Activity.setContentView()最終將調用android.support.v4.app.Fragment.javaFragment.onInflate() - 線920,Fragment.onAttach() - 線928,Fragment.onCreate() - 線953,Fragment.onCreateView() - 線967,和Fragment.onViewCreated() - 線991

+0

「特別是,我知道Activity.setContentView()最終會調用android.support.v4.app.Fragment.java的Fragment.onInflate()」 - 不,它不會。 'Activity'對'android.support.v4.app.Fragment'一無所知。 'Activity'可能知道一些關於'android.app.Fragment'的內容。 'android.support.v4.app.FragmentActivity'可能知道'android.support.v4.app.Fragment'。 – CommonsWare

+0

是的@CommonsWare,你是對的。事實上,根據源代碼,在FragmentActivity.onCreate()中調用'Fragment.onAttach()','Fragment.onCreate()','Fragment.onCreateView()'和'Fragment.onViewCreated() >'mFragments.dispatchCreate()'>'FragmentManager.moveToState(Fragment.CREATED,false)'。但令人驚訝的是,我在'setContentView()'之前和之後以及這些'Fragment'方法中添加了一些'System.out.println()'。看來這些'Fragment'方法在'setContentView()'中被調用。 – midnite

+0

[有些Java可以幫助使用Android源代碼?](http:// stackoverflow。COM /問題/ 16764572 /一些-java的幫助,用最Android的源代碼,請) – StarPinkER

回答

0

你可以找到這個消息在

政策執行:source

窗口的實現:source