2011-10-13 3 views
22

this questionのような問題が発生しましたが、onNewIntentをオーバーライドするときに明示的にsetIntentを呼び出さなければならない理由と、なぜこのコードがsuper.onNewIntentによってまだ実行されていないのか不思議になりました。onNewIntentをオーバーライドするときにsetIntentを呼び出さない理由はありますか?

@Override 
public void onNewIntent(Intent intent) 
{ 
    super.onNewIntent(intent); 

    // Why isn't this performed by the framework in the line above? 
    setIntent(intent); 
} 

答えて

31

Intentオブジェクトは、これらのコンポーネントが実行されている限り、ActivityServiceおよびその他のコンポーネントに永続的にアタッチされます。あなたが別のアプリケーションに移動したため、単に離れて行くだけではありません。その理由は、Androidがいつでもプロセスを終了させる可能性があるからですが、ユーザーはまだ戻って自分が行っていたことを続けたいと思うかもしれません。これにより、インテントはエクストラを介して情報の小さな(時には大きな)ビットを格納または送信するのに理想的です。

onNewIntent()のメソッドは、より永続的なアプリケーションコンポーネントを処理するためのもので、LifeCycle中に複数回呼び出すことができますが、呼び出された理由(したがって呼び出されたデータ) 。 setIntent()に電話するかどうかは、何をする必要があるかによって異なります。

なぜそれが後で呼び出されたか気にしない場合は、元のIntentsetIntent()にコールしないでください。これは、誰が呼び出しても、それが提供するデータに関係なく、あなたのActivity(または他のコンポーネント)が同じことをするときに特に便利です。

各イベントに個別に対応する必要がある場合は、少なくとも新しいIntentの情報を保存する必要があります。つまり、setIntent()を避けることができますが、リンク先のコンポーネントには、直接送信しない限り、Intentの情報は含まれません。これは、元のIntentが完全に処理されたことを保証できないアプリケーションにとって望ましい動作です。

個々のインテントに個別に応答する必要があり、オリジナルのIntentは問題でない場合は、setIntent()を使用します。これにより元のIntentが破棄されますが、そこにはまだ新しいものがあります。ユーザーが離れても同じ場所に戻るように、新しいIntentを配置します。

super.onNewIntent()がこれを処理しない理由は、コアコンポーネントクラスが新しいものが古いものよりも重要であるかどうかを判断できないためです。それが気になるのは、にはIntentがあります。これが、このようなメソッドをオーバーライドする理由です。つまり、は、重要なものと重要でないものを決定します。 Activityのような基底クラスは、どんな方法であれ、私たちが持っているどんなデータでも使うことができます(オーバーライドして別途指示しない限り)。しかし、私たちが具体的に指示しない限り、彼らは私たちのデータを取り除くべきではない(しばしばできません)。 これは、あなたが実際にいくつかのプログラマーとしたくない議論です。 hehe

これは役立ちます。

+0

この回答に本当に感謝します。目的は今私には非常に明確です。乾杯! – w3bshark

2

onNewIntent状態のためのドキュメント:「getIntent()がまだ本来の意図を返すことをあなたがこの新しいテントにそれを更新するsetIntent(意図)を使用することができます。」私の推測では、onNewIntentが存在するため、あなたのアクティビティが通知され、スーパーはおそらく何もしません。

1

onNewIntent(Intent intent)の実装からsetIntent(intent)コードを削除しました。

理由: 私のMainActivityはシングルトップです。私のアプリが動いている間、それはカメラ活動のような他の活動を開始します。アプリがMainActivityに戻ると、onResume()の中で、getIntent()によって返された(最後の)インテントは、既に処理されていたとしても再処理されます。

新しい実装(これまでの作業): onNewIntent(Intent intent)のインテントをプライベートインスタンスフィールドに格納します。 onResumeでは、このフィールドにnot nullをチェックしてすぐにnullにリセットし、インテントを1回だけ処理します。

も参照してください。https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY

関連する問題