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