0

(Google ドキュメントによると) 基本的な Android 開発の要件の 1 つは、アクティビティのライフサイクル メソッド (onCreate、onResume、onPause など) をオーバーライドするときは、最初に親のメソッドを呼び出す必要があることです。

@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 パターンを使用しないという設計上の決定の背後にある理由は何でしたか?

更新: しばらくの間 Android 向けの開発を行ってきましたが、職場の全員が私の BaseActivity NVI クラスを使用していますが、すべてのライフサイクル メソッドではなく onCreate メソッドで NVI を使用しない理由にまだ遭遇していません。既存のAPI設計を擁護して回答/コメントした人は、本当に正当化されていないか、NVIパターンが何であるかを本当に理解していないように見えるので、私は良いことはないと仮定して行きます理由は、「そのまま」だからです。

4

2 に答える 2

4

メソッドの最初のステートメントとしてスーパー メソッドを呼び出す必要はありません。スーパーメソッドが呼び出される前後に何かをしたい場合があります。

たとえば、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();
}
于 2014-06-17T17:40:34.753 に答える
0

これは API の設計上の選択です。これは API サーフェスを小さく (メソッドを少なく) 保ち、標準パターン ( http://en.wikipedia.org/wiki/Decorator_pattern ) です。

于 2014-06-17T17:42:58.683 に答える