スマホ - android バージョン
アプリケーションをぶつけて終了するのですか? (20)
Androidを学ぼうと私の試みを続けていくうちに 、私は次のように読んだだけです。
質問: 私たちがメニューオプションを置かない限り、アプリケーションを終了する選択肢がありますか? そのようなオプションが存在しない場合、ユーザーはアプリケーションをどのように終了させますか?
回答:(Romain Guy): ユーザーはそうしません。システムはこれを自動的に処理します。 これがアクティビティライフサイクル(特にonPause / onStop / onDestroy)の目的です。 あなたが何をしていても、「終了」または「終了」アプリケーションボタンを置かないでください。 Androidのアプリケーションモデルでは無用です。 これは、コアアプリケーションの動作にも反する。
Hehe、私はAndroidの世界で取るすべてのステップのために私はいくつかの問題に遭遇する=(
どうやら、あなたはAndroidでアプリケーションを終了することはできません(しかし、Androidシステムは、それが気に入ったらいつでもあなたのアプリケーションを完全に破壊することができます)。 どうしたの? 私は、 "普通のアプリ"として機能するアプリを書くことは不可能だと思うようになっています。つまり、ユーザーは、アプリを終了することができます。 これは、OSに依存する必要があるものではありません。
作成しようとしているアプリケーションは、Androidマーケットのアプリケーションではありません。 一般の方々の「幅広い用途」のアプリケーションではなく、非常に幅の狭いビジネス分野で使用されるビジネスアプリです。
私はAndroidプラットフォームの開発を実際に楽しみにしていました.Windows Mobileや.NETに存在する多くの問題に対処しているからです。 しかし、先週のことは私のためにややターンオフしています...私はAndroidを放棄する必要はないと思っていますが、今はとても良く見えません=
本当にアプリケーションを終了する方法はありますか?
回答:(Romain Guy):ユーザーはそうしません。システムはこれを自動的に処理します。これがアクティビティライフサイクル(特にonPause / onStop / onDestroy)の目的です。あなたが何をしていても、「終了」または「終了」アプリケーションボタンを置かないでください。 Androidのアプリケーションモデルでは無用です。 これは、コアアプリケーションの動作にも反する。
1:アプリケーションを完全に終了することは一般的には不可解かもしれませんが、無駄ではありません。ウィンドウに終了オプションがないとどうなりますか?メモリがいっぱいになるとシステムは遅くなり、OSはあなたがどのプログラムを終了したかを推測しなければなりませんでした。私はRomain GuyやLarry PageとSergey Brinの言葉には気をつけません。これは疑問の余地のない事実です。新しいアプリを起動する前にタスクを殺してメモリを獲得する必要がある場合、システムが遅くなります。あなたはアプリを殺すのに時間がかからないと私に言うことはできません!遠くの星からの光にさえ時間がかかる... ユーザがアプリケーションを完全に閉じることを可能にすることにいくつかの用途がある。
2:コアアプリケーションの仕組みとは異なりますか?それはどういう意味ですか?今のところアプリケーションの実行が終わったら、もう何もしません。メモリが必要なときにOSによって殺されるのを待っています。
要約すると、最小化と終了の間に明確な違いがあり、どちらのピンチもうまく当てはまりません。すべてのネジにドライバーを残していますか?すべてのドアに鍵がありますか?ブレーカが吹き飛ばされ、別のアプライアンスをオンにする必要があるまで、アプライアンスをすべてハイにしますか?私たちは食器洗い機を食器でいっぱいにして、新しい汚れたもののための部屋を作るために毎回十分に取り出しますか?ドライブウェイにすべての車を走らせておきますか?
ユーザーがアプリを最小限に抑えたい場合は、アプリを最小限に抑えることが最善の方法です。ユーザーがアプリを終了したい場合は、必ず終了することをおすすめします。
それはぶつかるの?これがアンドロイドの見解である。そして多くの独立した新人のAndroidデベロッパーが怒っている。
しかし、それがすぐに来たら、良いコーディングと悪いコーディングがあります。良いプログラムフローモデルがあり、悪いプログラムフローモデルがあります。
ユーザーがプログラムを完了したことを知ったときにプログラムをメモリに残すだけでは、プログラムの流れが良くなりません。それはまったく目的を果たさず、新しいアプリを起動するときやアプリを実行するときにもっと多くのメモリを割り当てるときには遅くなる。
それはあなたの車のようなものです:あなたが停止灯で停止するか、またはファストフードドライブを通過するか、ATMで停止するように、それを実行しておく時間があります。しかし、仕事をしたり、食料品店や家にいても、シャットダウンしたい状況があります。
同様に、あなたがゲームをしているときに電話が鳴ったら、はい。ゲームを一時停止し、実行し続ける。しかし、ユーザーがしばらくの間ゲームをやり終えたら、忘れずに終了させてください。
一部のアプリケーションの終了ボタンは、他のアプリケーションよりも前面にある必要があります。たとえば、ゲームやユーザーが完全に退出したいと思うプログラムでは、明らかに退出する必要があります。他のプログラムは、おそらく、電子メールプログラムのように、終了する可能性は低い(電子メールのチェックを続けることができる) - これらのプログラムは、終了オプション付きのプライムコントロール入力画面スペースを無駄にしてはならないが、終了オプションが必要です。誰かがメールプログラムが不十分なカバレッジエリアにいるときにメールをチェックしようとしない、あるいはSkypeコールなどで何かをしたくないと決めたらどうしますか?彼らが望むなら、彼らは電子メールプログラムを終了させましょう!
一時停止と終了は2つの重要なタスクであり、いずれも他方の役割を果たすものではありません。
戻るボタンを押すか、 Activity
でfinish()
を呼び出すことによって、終了することができます。 明示的にMenuItem
たい場合は、 MenuItem
からfinish()
を呼び出してください。
Romainはそれができないと言っているわけではありません。無意味なことです。ユーザーは、アプリケーションのライフサイクルが機能するように、自動的に保存してスマートなソフトウェアを書くことを奨励しています。何が起こってもその状態を復元します。
Androidアプリケーションのライフサイクルは、コンピュータユーザーではなく携帯電話ユーザー向けに設計されています。
アプリのライフサイクルは、Linuxサーバをコンシューマ用アプライアンスに変えるために必要な、残酷に単純なパラダイムです。
AndroidはJava over Linux、実際のクロスプラットフォームのサーバーOSです。それがそんなに速く広がったのです。アプリのライフサイクルは、OSの基本的な現実をカプセル化しています。
モバイルユーザーには、アプリはインストールされたばかりか、インストールされていません。実行または終了という概念はありません。実際、アプリケーションプロセスは、OSがそれらのリソースを解放するまで実行されます。
これはスタックオーバーフローなので、これを読んだ人は誰でもコンピュータユーザーであり、モバイルアプリのライフサイクルを理解するためには知識の90%をオフにする必要があります。
あなたが10,20 ..複数のアクティビティを実行していて、それらをすべて終了してシステムから終了したい場合。
application class
またはで静的配列を作成するconstants class.
定数
public class Constants {
public static ArrayList<Activity> activities = new ArrayList<Activity>();
}
MainActivityこの配列の現在のアクティビティ参照を追加する
activity = MainActivity.this; Constants.activities.add(activity);
public class MainActivity extends Activity {
private ImageView imageButton;
private Activity activity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = MainActivity.this;
Constants.activities.add(activity);
imageButton = (ImageView) findViewById(R.id.camera);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// existing app.
if (Constants.activities != null) {
for (int i = 0; i < Constants.activities.size(); i++) {
Activity s = Constants.activities.get(i);
s.finish();
}
}
//super.finish();
finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
});
}
}
いずれにしても、アプリケーションを終了したい場合は、いつでも System.exit(0);
。
うーん...
私はあなたがAndroidアプリを正しい方法で見ていないと思う。あなたは、あなたが簡単に望むものとほとんど同じようにすることができます:
開発者のライブサイクルのドキュメントで推奨されているように、アプリのアクティビティは状態を保存/復元しますか?
復元段階でログインが必要な場合(ログイン/セッション情報が利用できない場合)、それを行います。
最終的にボタン/メニュー/タイムアウトを追加する
finish()
と、ログインやその他のセッション情報を保存せずに、アプリケーションセッションの終了を明示的に行います。つまり、アプリケーションを開始/再起動すると、新しいセッションが開始されます。
そうすれば、アプリが実際にメモリから削除されているかどうかは気にしません。
あなたが本当にメモリから削除したい場合(これはどのような目的のためにところでがっかり、とされて?)あなたはの終わりに条件付きでそれを殺すことができるonDestroy()
とjava.lang.System.exit(0)
(あるいは多分restartPackage(..)
?)。もちろん、それはあなたが本当にアプリケーションを終了させたい場合にのみ行います。これonDestroy()
はアクティビティの通常のライフサイクルの一部であり、アプリの終了ではないからです。
これは最終的にあなたの質問になりますが、私は最初に、あなたがこの執筆の時点ですでに与えられた様々な答えにあなたの様々なコメントで提起したいくつかの問題に取り組んでいきたいと思います。 私はあなたの心を変えるつもりはない - むしろ、将来この記事を読むために来た人たちのためにここにいる。
ポイントは、私のアプリがいつ終了するのかをAndroidが決定することを許すことができないということです。 それはユーザーの選択でなければなりません。
何百万人もの人々が、環境が必要に応じてアプリケーションを閉じるモデルに完全に満足しています。 これらのユーザーは、単にAndroidアプリを「終了」することは考えていません.Webページを「終了」する、またはサーモスタットを「終了」すること以上のことは考えていません。
iPhoneのユーザーは、iPhoneのボタンを押すだけで、アプリが本当にシャットダウンされたとしても、多くのiPhoneアプリはユーザーが中断した場所をピックアップするので、アプリケーションが終了したように必ず「感じる」というわけではありません。一度に1つのサードパーティアプリを許可します)。
私が上記のように、私のアプリでは、多くのことが起こっています(デバイスにプッシュされたデータ、常にそこにあるはずのタスクなどのリスト)。
私は「いつもそこにあるはずのタスクを含むリスト」が何を意味するのか分かりませんが、「デバイスにプッシュされたデータ」は楽しいフィクションであり、どんな場合でもアクティビティで行うべきではありません。 AlarmManager
使用してスケジュールされたタスクを使用してデータを更新し、信頼性を最大限にAlarmManager
ます。
私たちのユーザーはログインして、電話をかけたり、Androidがアプリを殺すことを決めたりするたびにログインすることはできません。
これに対処する多くのiPhoneとAndroidアプリケーションがあります。 通常は、ユーザーが毎回手動でログインするのではなく、ログオン資格情報を保持するためです。
たとえば、アプリケーションを終了するときに更新をチェックする
これは、どのオペレーティングシステムでも間違いです。 ご存じのように、OSがシャットダウンしているため、アプリケーションが「終了」している理由は、更新プロセスが途中で失敗するためです。 一般的に、それは良いことではありません。 開始時の更新を確認するか、アップデートを完全に非同期的に(例えば、スケジュールされたタスクを介して)チェックし、決して終了しないでください。
いくつかのコメントは、戻るボタンを押すことは、アプリケーションをまったく殺さないことを示唆している(上記の私の質問のリンクを参照)。
BACKボタンを押しても「アプリを強制終了」しません。 ユーザーがBACKボタンを押したときに画面上にあるアクティビティを終了します。
ユーザーは終了する必要があるときに終了する必要があります。他の方法は決してありません。 あなたがAndroidのように動作するアプリケーションを書くことができないなら、私はAndroidを実際のアプリを書くのに使うことはできないと思う=(
どちらもWebアプリケーションはできません。 私がモデルを正しく理解していれば( WebOSと一緒に遊ぶチャンスがない) これらのすべてにおいて、ユーザーは何も「終了」しません。ただ終了します。 iPhoneはちょっと違っている。というのも、現在のところ、いくつかの例外を除いて、一度に1つのことしか実行できないからである。そのため、放置すると、アプリの即時終了を意味する。
本当にアプリケーションを終了する方法はありますか?
誰もが話しているように、ユーザー(BACK経由)またはコード( finish()
経由)は、現在実行中のアクティビティを閉じることができます。 ユーザーは通常、適切に書かれたアプリケーションのために、Webアプリケーションを使用するための「終了」オプションを必要とするもの以外には何も必要ありません。
定義上、2つのアプリケーション環境は同じではありません。 これは、新しいものが生まれ、他の人が埋もれたときの環境の傾向を見ることができることを意味します。
たとえば、「ファイル」の概念を排除しようとする動きが増えています。 ほとんどのWebアプリケーションでは、ユーザーはファイルを考える必要がありません。 iPhoneアプリは通常、ユーザーにファイルの考え方を強いるわけではありません。 Androidアプリでは一般的にユーザーにファイルの考え方を強いるわけではありません。 等々。
同様に、アプリの「終了」という概念を排除しようとする動きが増えています。 ほとんどのWebアプリケーションはユーザーに強制的にログアウトするのではなく、一定期間使用しないと暗黙的にユーザーをログアウトさせます。 Androidの場合と同じで、iPhoneの場合もWebOSの場合も同じです。
これには、ビジネス目標に焦点を当て、以前のアプリケーション環境に結びついた実装モデルに固執することなく、アプリケーション設計を重視する必要があります。 これを行う時間や傾向がない開発者は、既存のメンタルモデルを破る新しい環境では不満を感じます。 これはどちらの環境の欠点でもありません。それよりもむしろ周囲を流れる嵐のための山の欠点です。
たとえば、 HypercardやSmalltalkのような開発環境では、アプリケーションと開発ツールが1つのセットアップで混在していました。 このコンセプトは、アプリケーションの言語拡張(例えば、 Excel VBA 、AutoCADのLisp )の外では、それほどVBAませんでした。 したがって、アプリ自体に開発ツールの存在を前提としたメンタルモデルを開発したデベロッパーは、モデルを変更したり、モデルが成立する環境に自分自身を限定したりする必要がありました。
だから、あなたが書くとき:
私が発見した他の面倒なことに加えて、私はAndroid用のアプリを開発することは起こりそうにないと思う。
それは今のところあなたのために最高のように見えます。 同様に、私はあなたのアプリケーションをWebに移植しようとするのではなく、あなたがAndroidで報告したのと同じ問題のいくつかがWebアプリケーションでも見つかるから(例えば、 "終了"しない) 逆に、アプリをウェブに移植すると、いつの間にか、Androidアプリケーションの流れがより良くなる可能性があり、その時点でAndroidポートを再訪することができます。
これは興味深く洞察に満ちた議論であり、非常に多くの専門家が貢献しています。 Android OSのコアデザインの1つを中心にしているため、このポストはAndroid開発のメインWebサイトからループバックされるべきだと感じています。
私はまた、ここに私の2セントを追加したいと思います。
これまでのところ、私はAndroidのライフサイクルイベントを処理する方法に感銘を受け、ネイティブアプリにウェブのような体験のコンセプトをもたらしました。
私はまだQuitボタンがあるべきだと私は信じていると言っています。 どうして? ...私やテッド、あるいはここの技術者のためではなく、エンドユーザの要求を満たす唯一の目的のためです。
私はWindowsの大ファンではありませんが、大抵のエンドユーザーは(Xボタン)に慣れているというコンセプトを導入しました...「私がしたいときにウィジェットを実行しています。
それは誰か(OS、開発者)が自分の裁量でそれを世話することを意味するのではなく、単に "私が慣れていた赤いXボタンがどこにあるのか"を意味します。 私の行動は、「ボタンを押したときに電話を終了する」、「ボタンを押して電話を切る」などのようなものでなければなりません。 それは私の行動が本当にその目的を達成するという満足感をもたらします。
開発者がここに示した提案を使用してこの動作を偽装することはできますが、エンドユーザーの要求に応じて独立した信頼できる中立のソース(OS)によってアプリケーションが完全に機能しなくてはならないという認識が残ります。
アプリケーション開発者が独自のアプリケーションを終了するための終了機能がなければ、それは非常に悪い設計です。
私のアプリケーションでは、ランタイム中にユーザーが動的にデータを動的に変更できるようにする必要があり、変更効果を得るためにアプリケーションを再起動する必要があります。Android OSのデザインアプリケーションのライフサイクルは非常に悪い
インテントで次のページに移動するたびに、次のように使用します。
`YourActivityname.this.finish()`;
例:
Intent intent = new Intent(getApplicationContext(), SMS.class);
startActivity(intent);
MainActivity.this.finish();
バックグラウンドでアクティビティが実行されないようにするには、アプリを終了するときは次のようにします:
MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();
これは私のための魅力のように働いて終了:)
ブログ記事Android Appsに終了ボタンを含めるべきとき(ヒント:決して) 、私ができることよりはるかに優れている。 私は、すべてのAndroid開発者がすでにそれを読んでおきたいと思う。
抜粋:
私の経験では、ユーザーが本当に望んでいるのは、アプリケーションがリソース(バッテリー、CPUサイクル、データ転送など)の消費を停止することを保証する明白な方法です。
多くのユーザーは、終了ボタンがこの要件を実装し、追加することを要求していると認識しています。 ユーザーを喜ばせようとする開発者は、義務的に追加します。 その後すぐに両方とも失敗する。
- ほとんどの場合、終了ボタンは単に
Activity.finish()
呼び出します。 これは、戻るボタンを押すこととまったく同じです。 まったく。 サービスは稼働し続け、ポーリングは継続します。 ユーザーはアプリを殺したと思うかもしれないが、そうではないと思うかもしれません。そしてすぐに彼らはさらに迷惑になります。- 出口の動作が曖昧になりました。 exitボタンでアクティビティを閉じるか、関連するすべてのサービス、レシーバ、アラームを停止する必要がありますか? 後ろに何をするべきですか? 代わりにホームにヒットした場合はどうなりますか? あなたのアプリにウィジェットがあればどうなりますか? 終了ボタンでも更新を停止する必要がありますか?
解決方法は、終了ボタンが表示されるように、戻るボタンを動作させることです。 アプリが表示されていないときは、リソースの消費を停止するだけです。
先に進み、完全な記事を読んでください。
半自動的なAndroidアプリケーションライフサイクルを実際に実装するよりも、このQ&Aを読むのに時間がかかりました。
これは、ポイントをポーリングし、スレッドを使用して数秒ごとに現在の場所をWebサービスに送信するGPSアプリケーションです。これは、Tedのケースでは5分ごとにポーリングして更新できます。その後、onStopは更新アクティビティを開始できます。 (非同期Ted、Windowsプログラマのようにコード化しないでください、またはあなたのプログラムがWindowsプログラムのように実行されていれば...それは難しいことではありません)。
私はonCreateでいくつかの初期コードを実行して、活動の生涯のためのものを設定しました。 checkUpdate.start();
:
...
@Override
public void onStart() {
super.onStart();
isRemote = true;
checkUpdate.resume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}
@Override
public void onPause() {
isRemote = false;
checkUpdate.suspend();
locationManager.removeUpdates(luh);
super.onStop();
}
このコードは完全に間違っているかもしれませんが、動作します。これは私の最初のAndroidアプリケーションの1つです。
Voilàは、バックグラウンドでCPUを消費しないアプリケーションですが、RAMに保存されているためRAMに保存されているため、即座に開くことができます(アプリのライフサイクルはRAMを保持しません)。 、みんな/ギャル。もしアプリケーションがすべてのRAMを使い切っていて、OSによってシャットダウンできなかったなら、それはリンギングを止めるかもしれない= Pこれは、OSがバックグラウンドにいるときにあなたのアプリケーションを閉じることができる必要がある理由です(あなたのアプリケーションがリソースホッグではそれが閉じられることはありません)、より良いアプリケーションを作成しましょう。
私のアプリケーションはすべてボタンを終了しました...そして、私は頻繁にそれが原因でユーザーから肯定的なコメントを得ています。 プラットフォームがアプリケーションで必要としないように設計されているかどうかは気にしません。 「そこに置いてはいけない」と言うのはばかげています。 ユーザーが終了したい場合は...私は彼らにそれを行うためのアクセスを提供します。 私はそれがAndroidがどのように動作するかを減らし、良い習慣のように思える。 私はライフサイクルを理解しています...そして、私の見解は、Androidがそれを扱う上で優れた仕事をしていないということでした....そしてそれは基本的な事実です。
私はちょうどこのスレッドの今後の読者のための修正をここに追加したいと思います。 この特別なニュアンスは私の理解を長い間逃してしまったので、あなたの誰も同じ過ちを犯さないようにしたいと思います。
スタックに複数のアクティビティがある場合、 System.exit()
はあなたのアプリケーションをSystem.exit()
しません。 実際には、プロセスが強制終了され、スタック上のアクティビティが1つ少なくなってすぐに再起動されます。 これはまた、強制終了ダイアログによってアプリケーションが強制終了された場合、またはDDMSからプロセスを強制終了しようとした場合にも起こります。 これは私の知る限り、完全に文書化されていない事実です。
簡単な答えは、アプリケーションを終了したい場合は、スタック内のすべてのアクティビティを追跡し、 finish()
するときにそのすべてを終了させる必要があります(また、繰り返しはできません)アクティビティスタックは、あなた自身ですべてを管理する必要があります)。 それでも、実際にプロセスやあなたが持つ可能性のある参照が壊れているわけではありません。 単に活動を終わらせるだけです。 また、 Process.killProcess(Process.myPid())
かどうかはProcess.killProcess(Process.myPid())
ません。 私はそれをテストしていない。
一方、スタックにアクティビティを残しておけば、 Activity.moveTaskToBack(true)
非常に簡単にするもう1つの方法があります: Activity.moveTaskToBack(true)
は、プロセスをバックグラウンドにしてホーム画面を表示するだけです。
長い答えには、この振る舞いの背後にある哲学の説明が必要です。 この哲学は、いくつかの前提から生まれています。
- まず第一に、これはアプリケーションがフォアグラウンドにある場合にのみ発生します。 バックグラウンドであれば、プロセスは正常終了します。 しかし、それがフォアグラウンドにある場合、OSはユーザが自分が何をしていても何もし続けることを望んでいると仮定する。 (DDMSからプロセスを終了しようとしている場合は、最初にホームボタンを押してからkillする必要があります)
- また、各アクティビティは他のすべてのアクティビティとは独立していると想定しています。 これは、アプリがブラウザアクティビティを起動する場合など、多くの場合に当てはまります。ブラウザアクティビティは、完全に別個であり、あなたによって書かれたものではありません。 ブラウザアクティビティは、マニフェスト属性に応じて、同じタスクで作成される場合と作成されない場合があります。
- それはあなたの活動のそれぞれが完全に自立していることを前提としています。 (私のアプリは大量のキャッシュデータに依存し、
onSaveInstanceState
間に効率的にシリアライズするには大きすぎますが、これは大したことです)最もよく書かれたAndroidアプリの場合、これは真実でなければなりませんあなたのアプリがバックグラウンドでいつ殺されるのかを決して知らないからです。 - 最終的な要素はあまり前提ではなく、むしろOSの制限です。つまり、アプリケーションを明示的に終了することは、アプリケーションがクラッシュするのと同じです。また、Androidがメモリを再利用するためにアプリを強制終了することと同じです。 これは、クーデターの功を奏します。アプリが終了したか、クラッシュしたのか、バックグラウンドで死んだのかをAndroidが知ることができないため、ユーザーは中断したところから戻ってくると考えているため、ActivityManagerがプロセスを再開します。
あなたがそれについて考えるとき、これはプラットフォームにとって適切です。 まず、バックグラウンドでプロセスが強制終了され、ユーザーがそのプロセスに戻ると、プロセスが途中で再開される必要があります。 次に、アプリがクラッシュし、恐怖の強制終了ダイアログが表示されたときに発生します。
ユーザーが写真を撮ってアップロードできるようにしたいとします。 自分のアクティビティからCamera Activityを起動し、画像を返すように依頼します。 カメラは、自分のタスクで作成されるのではなく、現在のタスクの一番上にプッシュされます。 カメラにエラーがあり、クラッシュした場合、その結果、アプリケーション全体がクラッシュするでしょうか? ユーザーの立場から見れば、カメラだけが故障し、以前の動作に戻す必要があります。 つまり、カメラを除いたスタック内のすべての同じアクティビティでプロセスを再起動するだけです。 あなたの活動は 、帽子のドロップで殺され、復元されるように設計されるべきであるので、これは問題ではありません。 残念ながら、すべてのアプリがそのように設計できるわけではありませんので、Romain Guyや他の誰かがあなたに語っても、それは多くの人にとって問題です。 したがって、回避策を使用する必要があります。
だから、私の最後のアドバイス:
- プロセスを強制終了しないでください。 すべてのアクティビティで
finish()
を呼び出すか、moveTaskToBack(true)
呼び出しmoveTaskToBack(true)
。 - あなたのプロセスがクラッシュしたり、殺されたりした場合、私のように今失われたメモリ内のデータが必要な場合は、ルートアクティビティに戻る必要があります。 これを行うには、
Intent.FLAG_ACTIVITY_CLEAR_TOP
フラグを含むIntentでstartActivity()
を呼び出す必要があります。 - Eclipse DDMSの観点からアプリを削除したい場合は、フォアグラウンドにいないほうが良いでしょう。そうしないと、自動的に再起動します。 最初に[ホーム]ボタンを押してから、プロセスを終了する必要があります。
Androidアプリケーションが自分のライフサイクルを乗り越える必要がない時間の約99%。ほとんどの場合、アプリケーションの設計やスマートな設計が改善されます。たとえば、ダウンロードなどを処理するための内部サービス(エクスポートされていない)を構築したり、ユーザーワークフローに関するアクションやタスクを設計したりします。
しかし、そこには、方法があるという意志があると言われています。Androidは、android.os.Processクラスを使用して、Javaよりもはるかに優れたAPIを使用して、基礎となるプロセスを制御します。Javaとは違って、単純なjava.lang.System.exit()呼び出しの背後に隠れているので、開発者を愚か者のように扱うことはありません。
あなたのアプリケーションにAndroidで自殺するにはどうしたらいいですか?まあ、トリックは簡単です:
標準のandroid.app.Applicationクラスを継承して独自のAndroidアプリケーションクラスを作成します(AndroidManifest.xmlファイルで宣言してください)。
onCreate()メソッドをオーバーライドし、アプリケーションを起動したプロセスIDを格納します。
this.pid = android.os.Process.myPid(); // Save for later use.
アプリケーションを終了するには、kill()メソッドを提供してください:
android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);
今あなたが自殺するためにあなたのアプリを必要とするときは、ただアプリケーションのコンテキストをキャストして、あなたのkillメソッドを呼び出してください!
((MySuicidalApp) context.getApplicationContext()).kill()
Androidのプロセス管理ポリシー、具体的にはサービスに関連するため、Androidはサービスの再起動のみを選択するかもしれません(Androidでタスクキラーを使用すべきではありませんを参照)。
Linuxカーネルには、Out-of-memory killerという機能があります(前述のように、ポリシーはユーザー空間レベルで構成可能で、カーネルは最適ではありませんが、不要ではありません)。
そしてそれはAndroidで頻繁に使用されています:
Androidノート(OOM Killer Info - AndroidでOOM機能を設定できる場所)
いくつかのユーザスペースアプリは、次のようなkillアプリを手助けすることができます:
あなたは明らかにfinish()コマンドであなたが望む答えを見つけました。これはあなたのアプリをメモリから削除することはありませんが、Androidはリソースが必要なときはいつでもそうします。したがって、あなたが明示的にそれをしないという違いはありません。
私は、アプリケーションの終了が通常持っている完全な効果を得るために、アプリケーションの状態を、デバイスの起動後に最初に実行されたときの状態、通常の状態あなたのすべての活動について、finish()を呼び出します。こうすることで、ユーザーがあなたのアプリを再び選択した場合、シミュレートされた「終了」の前の状態から何も残らずに「新鮮」に実行されたように見えます。
ユーザーの作業を保存するなどの「終了」でのみ発生する必要のある特別なアクションがある場合は、上記のルーチンの再初期化の前に実行することもできます。
このアプローチでは、アプリケーションの終了を含むOSリソースの管理をオペレーティングシステムの手に委ねるというAndroidの考え方に違反することなく、「exit」コマンドを実行するという目標を達成できます。
個人的には、このアプローチは使用しません。なぜなら、Androidユーザーは、アプリが再訪する際にアプリの連続性を維持すると考えているため、アプリを「終了」するモダリティには慣れていません。私は代わりに、ユーザーがプロセスに「残す」必要なく、デフォルトの初期状態にアプリケーションをリセットするために呼び出すことができる「クリア」機能をサポートします。
1つの例外は、ユーザーがアプリケーションを終了させるのに十分な回数だけ戻るボタンを押した場合です。その状況では、状態が保存されるという期待はありません(また、アプリケーションに保存されていない状態がある場合は、開発者として、保存されていないデータを検出する戻るボタンを処理するコードが必要です)。ユーザにSharedPreferencesまたはファイル、または他の不揮発性媒体に保存するよう促します)。
system.exit(0)について:
system.exit(0)を使用して最終的なバックボタンを押した結果など無意味なアプリケーションを閉じることにした場合、私にはこれが「うまくいく」とか、ケースが残っていることがなくてもアプリを閉じることができたのは唯一のケースでしたが、このアプローチを使用するとJelly Beanで発生する小さな不具合があります。
具体的には、最近のアプリリストを使用してアプリを開いた後、戻るボタンを使用してアプリを閉じると(その終了はsystem.exit(0)によって実装されます)、最近のアプリリストは再び表示されます決して閉じられたことはありません。あなたはそれを実行するためにそのリストでアプリのエントリをタップする場合は二度目に同じ、既に開いて、最近使ったアプリのリストから、何の応答はありません。
私は、最近のAppsリストが、system.exit(0)を使ってアプリケーションを終了したために機能しなくなったあなたのアプリケーションへの参照を保持しているということが原因だと思う。 finish()を使ってアプリケーションをより文明的にクローズすると、最近のアプリリストをリフレッシュできるようにOSに通知するかもしれませんが、system.exit(0)はこれをしないようです。
最近のAppsからアプリを開き、終了してすぐに開いている最近使ったAppsリストからもう一度開いてしまう人は非常に少ないため、これは大きな問題ではありません。また、ホームボタンをタップして最近のアプリリストを再度開くと、あなたのアプリのエントリーがそこにあり、それは完全に機能します。しかし、私は、system.exit(0)の使用があなたのアプリとOSとの間の適切なコミュニケーションを妨げる可能性があることを示していると考えています。これは、このアプローチを使用することによって、
任意の時点でアプリケーションを終了するにFLAG_ACTIVITY_CLEAR_TOP
は、インテントのフラグを使用してからsystem.exit();
または、同様の方法がありますが、system.exit()
このメソッドを終了するときに終了する必要はありません。
public void exit() {
startActivity(new Intent(this, HomeActivity.class).
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}
あなたのHomeActivity.onCreate()
次のコードを追加する
protected void onCreate(Bundle savedInstanceState) {
if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
finish();
}
}
......................
これはAndroidのライフサイクルを崩さずに動作します。
私はAddison-Wesleyが出版した"Android Wireless Application Development"を読むことを検討します。私はちょうどそれを仕上げており、それは非常に徹底的です。
Androidプラットフォームの基本的な誤解があるようです。私もあまりにもAndroidアプリのアプリケーションライフサイクルに少し不満を抱いていましたが、大きな理解に達した後、私はこのアプローチを本当に楽しんでいます。この本はあなたの質問のすべてに答えます。それは本当に私が新しいAndroid開発者のために見つけた最高のリソースです。
また、既存のアプリのライン・フォー・ライン・ポートを放棄する必要があると私は思います。アプリケーションをAndroidプラットフォームに移植するには、アプリケーション設計の一部が変更される可能性があります。モバイルデバイスはデスクトップシステムに比べて非常に限られたリソースしか持たず、Androidデバイスが規則的かつリソースを意識した方法で複数のアプリケーションを実行できるため、使用されるアプリケーションライフサイクルは必要です。プラットフォームの深い研究をさらに深めてください。あなたがしたいことが完全に実現可能であることを理解すると思います。運が良かった。
ちなみに、私はAddison-Wesleyや、この本に関連する人や組織と提携しているわけではありません。私のポストを読んだ後、私はちょっとファンボーイだったと思う。私はちょうど本当に、それを楽しんで、それが非常に役立つことがわかった。 :)
私は、あなたがバグのあるソフトウェアを持っていない限り、アプリケーションを終了する必要はないという点が重要だと思う。ユーザーがアプリを使用していないときにアプリが終了し、端末にメモリが必要になったとき。バックグラウンドでサービスを実行する必要のあるアプリをお持ちの場合は、サービスを無効にする方法が必要です。
たとえば、アプリが表示されていないときは、Google Listenは引き続きポッドキャストを再生します。しかし、ポッドキャストが終了したときにポッドキャストをオフにするポーズボタンが常にあります。私が正しく覚えていれば、聞いて、通知バーにショートカットを入れて、いつでもすぐにポーズボタンに入ることができます。別の例は、インターネット上のサービスを常にポーリングするtwitterアプリのようなアプリです。これらのタイプのアプリでは、実際にサーバーをポーリングする頻度やバックグラウンドスレッドでポーリングするかどうかをユーザーが選択できるようにする必要があります。
終了時に実行されるコードが必要な場合は、必要に応じてonPause()、onStop()、またはonDestroy()をオーバーライドできます。http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle