2014-06-17 67 views
0

一個基本的Android開發(根據谷歌文檔)的要求是,當你重寫了活動的生命週期方法(的onCreate,的onResume,在onPause等),必須調用父類的方法首先:Android活動生命週期:爲什麼不調用超級方法先執行?

@Override 
protected void onResume() 
{ 
    super.onResume(); 
} 

爲什麼Android API不使用非虛擬接口模式來強制執行此行爲,而不是依靠開發人員記得這樣做?:

Android的Activity Base類可能看起來像這樣(粗略示例) :

public class Activity 
{ 
    public final void onResume() 
    { 
     // do important things here 
     virtualOnResume(); 
    } 
    protected abstract void virtualOnResume(); 
} 
由Android開發者編寫

子類:

public class MainActivity extends Activity 
{ 
    @Override 
    protected void virtualOnResume() 
    { 
     // do custom stuff here, without needing to call super.onResume() 
    } 
} 

我還沒有遇到過,我需要寫之前調用父類方法的任何指令的情況下。有沒有時間我們不應該調用超級方法,或者不先調用它?如果對於生命週期中的任何特定方法來說,它必須始終是第一位的,那麼設計決定背後的原因是不使用NVI模式來執行它?

UPDATE:現在已經開發Android的同時,每個人都在工作中使用我的BaseActivity NVI類,而且我還沒有遇到一個理由不使用的NVI的所有生命週期方法,但一個的onCreate。似乎那些回答/評論捍衛現有API設計的人並沒有真正的理由,或者似乎並不明白NVI模式是什麼,所以我假設沒有好的原因,這是「它是如何」。

+0

您不必調用'super.onResume();'只需調用'super.onCreate(...)'在'Activity'中是強制性的。除此之外,您可以完全覆蓋任何方法。 –

+0

Google文檔明確聲明總是在所有生命週期方法中調用super的方法。無論如何,即使它只是onCreate方法,同樣的問題代表:爲什麼不使用NVI呢? – orfdorf

+0

你能鏈接到它聲明這一點的文檔部分嗎?因爲它只需要'onCreate()'。如果你不在'onCreate()'中調用'super.onCreate()',就會拋出一個異常。 –

回答

4

您不必調用super方法作爲方法的第一條語句。有時你可能想在super方法被調用之前和之後做一些事情。

例如參見FragmentActivity

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mFragments.attachActivity(this, mContainer, null); 
    // Old versions of the platform didn't do this! 
    if (getLayoutInflater().getFactory() == null) { 
     getLayoutInflater().setFactory(this); 
    } 

    super.onCreate(savedInstanceState); 

    NonConfigurationInstances nc = (NonConfigurationInstances) 
      getLastNonConfigurationInstance(); 
    if (nc != null) { 
     mAllLoaderManagers = nc.loaders; 
    } 
    if (savedInstanceState != null) { 
     Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); 
     mFragments.restoreAllState(p, nc != null ? nc.fragments : null); 
    } 
    mFragments.dispatchCreate(); 
} 
+0

很好的答案。這顯然違背了他們在文檔中的建議。所有其他生命週期方法是否也存在這種情況? – orfdorf

0

這是一個API的設計選擇。它保持API表面更小(更少的方法)並且是標準模式(http://en.wikipedia.org/wiki/Decorator_pattern)。

+0

而NVI模式不是因爲...? (http://en.wikipedia.org/wiki/Non-virtual_interface_pattern) – orfdorf

相關問題