android学習ノート(七)

2612 ワード

一、standard
デフォルトの起動モードでは、ActivityがアクティブになるたびにActivityインスタンスが作成され、Activityスタックに格納されます.
たとえば、ActivityはA 1と呼ばれ、A 1にジャンプできるボタンがあります.では、ボタンをクリックすると、先ほどのA 1の上にActivity A 1インスタンスが重ねられます.
Intent intent=new Intent(MainActivity.this,MainActivity.this);
startActivity(intent);

二、singleTop
複数のインスタンスを持つことができますが、Activityの複数のインスタンスのオーバーラップは許可されません.つまり、このActivityにインスタンスがスタックの上部にある場合、このActivityを起動すると、新しいインスタンスは作成されず、onNewIntentメソッドが呼び出されます.スタックの上部にない場合は、新しいインスタンスが作成されます.
たとえば、2つのActivity名がB 1、B 2、B 1がstandard、B 2がsingleTopです.私が開く順番がB 1->B 2->B 2であれば、実際に開く順番はB 1->B 2(後でB 2を開こうとしたが、実際には前のonNewIntentメソッドのみが呼び出された.私が開く順番がB 1->B 2->B 1->B 2であれば、実際に開く順番は意図と同じである.)
android:launchMode="singleTop"

三、singleTask
同じアプリケーションで起動したときにActivityインスタンスが存在しない場合は、前のスタックに新しいインスタンスが作成され、存在する場合はスタックの上にある他のActivityインスタンスが破棄され、そのインスタンスのonNewIntentメソッドが呼び出されます.別のアプリケーションで起動すると、スタックが新規作成され、そのスタックでActivityが起動され、このactivityインスタンスで新しいActivityが開きます.この新しいActivityインスタンスはスタックにあります.
たとえば、アプリケーションには3つのActivity、C 1、C 2、C 3、3つのActivityが相互に起動できます.C 2はsingleTaskモードです.このプログラムでどのようにクリックして起動しても、1つのC 2しか存在しません(C 1とC 3には複数のインスタンスが存在する可能性があります).この3つのActivityは同じtackにあります.singleTaskモードのactivityを起動すると、taskの他のActivityインスタンスが破棄されます.
四、singleInstance
1つのインスタンスのみが存在し、このインスタンスは独立して1つのactivityタスクスタック(task)で実行されます.このtaskはこのインスタンスのみであり、他のActivityの存在は許可されません.
例:
3つのActivityはそれぞれD 1,D 2,D 3であり、D 2はsingleInstanceモードである3つのActivityは互いに起動することができる.では、プログラムはD 1から実行され、D 1のtaskIdが200であると仮定すると、D 1からD 2が起動されると、D 2とD 1が1つのtaskで実行されないtaskが新たに起動される.
D 2のtaskIdが201であると仮定し、D 2からD 3を起動すると、D 3のtaskIdは200であり、つまりD 1起動のtaskに押される.
別のアプリケーションでD 2を開く場合、OtherのtaskIdが200で、D 2を開くと、D 2は新たにtask実行を行い、taskIdが201であると仮定すると、このときD 2からD 1またはD 3を起動すると再びtaskが作成されるので、操作手順がother->D 2->D 1であれば、このプロセスは3つのtaskに及ぶ.
Activityの状態を保存および復元するには、次の手順に従います.
保存状態activityの状態
String str="lalala";
   @Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
   outState.putString("str",str);
super.onSaveInstanceState(outState);
Toast.makeText(this, "onSaveInstanceState", Toast.LENGTH_SHORT);
}

リカバリ状態activityの状態
@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    if(savedInstanceState==null)
    return;
    String str=savedInstanceState.getString("str");
    Toast.makeText(this, str, Toast.LENGTH_SHORT);
    }