2013-08-17 8 views
26

私はアンドロイドのプログラミングについて話しています。初期の頃にはfinish()とSystem.exit(0)の相違点

私はfinish()は、現在の活動を閉じ、アクティビティスタックに戻る前に行く、と思った、とSystem.exit(0)は、アプリケーション全体を閉じます。

しかし、私は間違っていました。 小さな実験を行いましたが、は両方とも現在のアクティビティだけ終了することを理解しました。私は気づくことができ


唯一の違いは、ActivityResult

  • のAndroid 2.3.3にonActivityResult()finish()を使用して戻って伝播される、ということです。一方、System.exit(0)にはonActivityResult()が呼び出されていません。

しかし、Android 4.2.2では、両方に対してonActivityResult()が呼び出されました。 exit()ではIntentがnullだった。 finish()速くであるのに対し、exit()を使用した場合

  • (私はこれらの2つのデバイスでテスト)タイムラグがあります。(出口でより多くのバックグラウンド処理のように思えるがあります())

ので、

  1. 2つの違いは何ですか?

  2. どのような状況でexit()を使用できますか?

私は2つの方法の間に何かがないと思っています。 誰かがもっと説明し、私を修正できることを願っています。 REQUEST UPON

おかげ

EDIT:

2つの活動でAndroidアプリケーションを作成します。インテントを使用してランチャーアクティビティから2番目のアクティビティを呼び出します。今度は、2回目のアクティビティの中で、ボタンをクリックすると、System.exit(0);が呼び出されます。 "VMをさらに実行し、プログラムを終了します停止する。" ????(documentationに従って)

Iが最初のアクティビティを参照してください。どうして?Androidデベロッパーによると

+1

http://stackoverflow.com/questions/2033914/quitting-an-application-that-that-frowned-uponです。ここで答えを確認してください – Raghunandan

+0

@ Raghunandan:それはいいです。誰もが見てください。しかし膨大な量の情報。誰でも私の主題に合わせて簡単に教えてもらえますか? – Nizam

+4

'System.exit()'を使用しないでください。私はそれをお勧めしません。 'finish()'を使ってください。ナビゲーションにはナビゲーション・ドロワーを使用できます。 – Raghunandan

答えて

9

実際にアクティビティが1つだけある場合は、実際には違いはありません。あなたがスタック上にいくつかの活動を持っている場合は、それから:

  • 仕上げ()は - それはから呼び出された活動を終了し、以前のアクティビティを参照してください。
  • System.exit(0) - スタック上に1つ少ないアクティビティでアプリを再起動します。ですから、ActivityAからActivityBと呼ばれ、System.exit(0)がActivityBに呼び出された場合、そのアプリケーションが殺されると一つだけの活動ですぐに開始ActivityA
13

は(あなたは/私が間違っていることを証明するために歓迎され、私は正しかった) -

finish()

コールこれはあなたの活動が行われ、閉鎖されるべきとき。 ActivityResultは、 onActivityResult()経由であなたを起動した人に伝播します。

System.exit(0)

VMは、さらに実行し、終了するプログラムを停止します。

+7

スタックに複数のアクティビティがある場合、System.exit()はアプリを強制終了しません。これをチェックしてください。 – Nizam

+6

@Nizam: "スタックに複数のアクティビティがある場合、System.exit()はあなたのアプリケーションを強制終了しません" - プロセスが終了していないという主張の証拠を提供することは歓迎します。プロセスが終了していないことを確認するために行った手順とともに、この動作を確認してください。 – CommonsWare

+6

@CommonsWare私はプロセスが終了していないと言わなかった。そして、私は内部で何が起こっているのか分からない。抽象化では、アクティビティ内でfinish()またはexit()を使用しているかどうかにかかわらず、以前のアクティビティが表示されます。それは私が殺されていないアプリの意味です。 – Nizam

9

文書に従って、プログラムは終了します。
しかし、ドキュメントのバグのようです。 Javaプログラムの場合、正しいです。しかし、Androidに来ると、前のアクティビティがスタックから表示されます。

AndroidコーディングはJavaコーディングを使用して行われるため、ほとんどのドキュメントはjavaのものと同じです。ドキュメントから

でSystem.exit(0)
VMは、さらに実行し、プログラムが終了します停止します。

Androidの場合、の「プログラム」を別のものに置き換える必要があります。 アクティビティまたはコンテキストかもしれません。

1

サQadaの答えは私のテストの後に正しいです。

終了はこのアクティビティを終了し、元の状態に戻ります。

が、出口があまりにも現在のアクティビティを閉じ、凍結内のすべての活動を空にして、あなたが唯一の活性を有している場合は、以前の活動

が実際に違いはありません再起動します。 ただし、スタックに複数のアクティビティがある場合は、

finish() - 呼び出されたアクティビティが終了し、前のアクティビティが と表示されます。 System.exit(0) - スタック上のアクティビティが少なくなるように のアプリケーションを再起動します。あなたは ActivityAからActivityBと呼ばれるのであれば、とでSystem.exit(0)ActivityBで呼び出され、その後、 アプリケーションが殺されるとActivityA

一つだけ 活動をすぐに開始
関連する問題