// //

{Android]Activityの終了とアプリケーションの終了

Android で System.exit() を使ってはいけない理由と、終了方法のまとめ
http://www.ecoop.net/memo/archives/2011-01-24-1.html


Activityを終了するときfinish()を
アプリケーション全体の終了はmoveTaskToBack(boolean nonRoot)が推奨とのこと。
ただ、moveTaskToBackはバックグラウンドで待機になる。


この内容に沿って複数のActivityを並べたときの終了と起動画面(タイトル)への
切り替えを実装したくぐちゃぐちゃしたのが前回まで。


とりあえず希望通りの動きでそこそこまとめてできた。


条件は前回と同じく0〜3のActivityを作成(act0〜act3)
順番にIntentで遷移し、act3で分岐する。
分岐はタイトル(act0)へもしくはアプリケーションの終了。
ここを参考にフラグクラスの作成。



act0

public class act0 extends Activity implements OnClickListener{

	static boolean exitFlag;

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.aaa);

		exitFlag = false;

		Button next = (Button)findViewById(R.id.button0);
		next.setOnclickListener(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onRestart(){
		super.onRestart();
		if(exitFlag == true){
			this.finish();
		}
	}

	@Override
	public void onClick(View view){
		switch(view.getId()){
		case R.id.button0:
			startActivity(new Intent(this, com.xxx.act1);
			break;
		}
	}
}


act1

public class act1 extends Activity implements OnClickListener{

	public static Flag actFlag;

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.bbb);

		flag = new Flag();

		Button next = (Button)findViewById(R.id.button1);
		next.setOnClickListener(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.main, menu);
	return true;
	}

	@Override
	public void onRestart(){
		super.onRestart();
		if(act1.actFlag.getFlag() == true){
			this.finish();
		}
	}

	@Override
	public void onClick(View view){
		switch(view.getId()){
		case R.id.button0:
			startActivity(new Intent(this, com.xxx.act2);
			break;
		}
	}
}


act2にも同様のonRestart()を実装する。


act3

public void act3 extends Activity implements OnClickListener{

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ddd);

		act1.actFlag.setFlag(true);

		Button title = (Button)findViewById(R.id.button3_1);
		title.setOnClickListener(this);
		Button exit = (Button)findViewById(R.id.button3_2);
		exit.setOnClickListener(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View view){

		switch(view.getId()){
		case R.id.buttonTitle:
			this.finish();
			break;

		case R.id.buttonExit:
			act0.exitFlag = true;
			this.finish();
			break;
		}
	}
}


最後のActivity(act3)がonCreate()した時点でactFlagを立てる。
これでact1〜act2はonRestart()した時点でfinish()するので、表示されない。
「タイトルへ」のボタン操作にはIntentでact0へ遷移するのではなく、
このActivityをfinish()するだけ。
上記内容でact1〜act2が表示されないのでact3自身をfinish()すればタイトルへ。


また、act0には終了用フラグ(exitFlag)を用意しonCreate()されると
falseが格納されるようにしておく。
act3の「終了」のボタン操作でexitFlagにtrueを格納し、act3自身をfinish()。
「タイトルへ」同様act0へ戻るのでonRestart()内でexitFlagを判別し、
trueだったらact0をfinish()すれば表示されずそのままアプリケーション終了。


素人なりのやり方かもしれないけどとりあえず二つのフラグを使って解決。
Intentに気をとられすぎた…
ところでonClick()ってボタンにsetOnClickListener()した直後の方がいいんだろうか?