Activityのsingletast起動モードとintent伝値の使用方法を詳しく説明する

2836 ワード

Activityの4つの起動モード:
    1. standard
モード起動モードは、ActivityがアクティブになるたびにActivityが作成され、タスクスタックに格納されます.
    2. singleTop
タスクのスタックトップにActivityのインスタンスがちょうど存在する場合は、そのインスタンスを再利用します.否定者は新しいインスタンスを作成し、スタックトップに挿入します(スタックにすでにActivityインスタンスが存在していても、スタックトップに存在しない限りインスタンスが作成されます).
    3. singleTask
すでにスタックにActivityのインスタンスがある場合は、そのインスタンス(インスタンスのonNewIntent()が呼び出されます)を再利用します.再使用すると、インスタンスがスタックの上部に戻るため、その上のインスタンスはスタックを削除されます.スタックにインスタンスが存在しない場合、スタックに新しいインスタンスが作成されます.
    4. singleInstance
新しいスタックにActivityインスタンスを作成し、複数のアプリケーションに変更スタックのActivityインスタンスを共有させます.変更モードのActivityのインスタンスがスタック内に存在すると、どのアプリケーションがActivityを再アクティブ化してもスタック内のインスタンスが再利用され、その効果は複数のアプリケーションが1つのアプリケーションを共有することに相当し、誰がActivityをアクティブにしても同じアプリケーションに入ることになります.
プロジェクトにはメッセージプッシュ機能があり、メッセージをプッシュするたびにFunctionActivityがオンになるので、それを繰り返すのを避けるために、後退時にこのActivityが何度も現れると、そのActivityの起動モードをsingleTaskに変更します.
これにより、その後のActivityを複数回起動すると、onNewIntent(Intent intent)メソッドが呼び出されます.
activityがintentを介してデータを渡す場合、activityが起動していない場合、この起動したばかりのactivityでgetIntent()を介してこのintentのデータが取得する.起動するactivityが既に存在する場合、getInten()メソッドで取得したintentは起動したactivityの元のintentである.すなわちintentのデータは更新されていない.このように起動したactivityで取得するintentのデータは古いデータである.intentからの新しいデータを取得するたびにonNewIntent(Intent intent)メソッドでsetIntent(intent)を呼び出してこの伝達された最新のintentを設定する必要がある.次のようになります.

 @Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 Log.e("tag", "onNewINtent ");
 setIntent(intent);
 String ringName = intent.getStringExtra("ringName");
 Log.e("tag", ringName+" ");
 if (ringName != null) {
 pager.setCurrentItem(1);
 }
 }


もちろん、activityの起動モードがstandardの場合、毎回新しいactivityが再作成されます.これも最新です.setIntentでこのintentを更新する必要はありません.
私のこのプロジェクトでは、FunctionActivityの中には4つのFragmentが入っています.このように私が他のActivityからFunctionActivityにジャンプするのはインスタンス化されず、getIntent()メソッドでも最新のintentを得ることはできません.この方法を解決するために.やはりonNewIntentメソッドでは、更新されたintentをgetIntent()を通過する.putExtras(intent);以下のように共有します.

@Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 Log.e("tag", "onNewINtent ");
 setIntent(intent);
 getIntent().putExtras(intent);
 }

これにより、関連付けられたFragmentで呼び出すことができます.

@Override
 public void onResume() {
 super.onResume();
 //  , , ringName null
 String ringName = getActivity().getIntent().getStringExtra("ringName");
 if (ringName != null) {
 newSound.setText(ringName);
 Log.e("tag", ringName + " ");
 SharedPreferenceUtil.setString(getActivity(),
  SharedPreferenceUtil.RINGTONE_NAME, ringName);
 }
}

ここでFragment呼び出しの場合は、必ずonResumeメソッドで行います.