アプリケーションを終了すると、眉をひそめますか?


1153

Androidを学ぶための私の試みに移って、私は以下を読むだけです:

質問:アプリケーションを強制終了するメニューオプションを配置しない限り、ユーザーはアプリケーションを強制終了することはできますか?そのようなオプションが存在しない場合、ユーザーはどのようにアプリケーションを終了しますか?

回答:(Romain Guy):ユーザーは処理しません。システムがこれを自動的に処理します。これがアクティビティのライフサイクル(特にonPause / onStop / onDestroy)の目的です。何をする場合でも、「終了」または「終了」アプリケーションボタンを配置しないでください。Androidのアプリケーションモデルでは役に立たない。これは、コアアプリケーションの動作にも逆です。

へへ、私がAndroidの世界で取るすべてのステップで、ある種の問題にぶつかります=(

どうやら、Androidでアプリケーションを終了することはできません(ただし、Androidシステムは、アプリが気になったらいつでも完全に完全に破棄できます)。どうしたの?「通常のアプリ」として機能するアプリを作成することは不可能だとユーザーは思い始めています。ユーザーがアプリを終了すると、アプリを終了できるのです。これは、OSに依存すべきではありません。

私が作成しようとしているアプリケーションは、Androidマーケット用のアプリケーションではありません。一般の方が「広く利用」できるアプリではなく、非常に狭いビジネス分野で利用されるビジネスアプリです。

Androidプラットフォーム向けの開発は、Windows Mobileと.NETに存在する多くの問題に対処しているので、本当に楽しみでした。しかし、先週は私にとってはややオフになっています...私はAndroidを放棄する必要がないことを願っていますが、今はあまりよく見えません=(

アプリケーションを本当に終了する方法はありますか?

回答:


1286

これは最終的にあなたの質問に到達しますが、私は最初に、この執筆時点ですでに与えられているさまざまな回答に対するさまざまなコメントで提起するいくつかの問題に対処したいと思います。私はあなたの考えを変えるつもりはありません。むしろ、これらは将来この投稿を読むようになる他の人のためにここにあります。

重要なのは、アプリがいつ終了するかをAndroidが判断できないようにすることです。それはユーザーの選択でなければなりません。

何百万もの人々が、環境が必要に応じてアプリケーションを閉じるモデルに完全に満足しています。これらのユーザーは、Androidアプリの「終了」については考えていません。Webページの「終了」またはサーモスタットの「終了」について考えている以上のことはありません。

多くのiPhoneアプリは、アプリが実際にシャットダウンされている場合でも、ユーザーが中断したところをピックアップするため、iPhoneユーザーはほとんど同じです。現在、一度に1つのサードパーティアプリを使用できます)。

上記で述べたように、私のアプリでは多くのことが行われています(データがデバイスにプッシュされている、常にそこにあるべきタスクのリストなど)。

「常にそこにあるべきタスクのリスト」の意味はわかりませんが、「デバイスにプッシュされるデータ」は楽しいフィクションであり、どのような場合でもアクティビティによって行われるべきではありません。スケジュールされたタスクを使用して(を介してAlarmManager)、信頼性を最大にするためにデータを更新します。

ユーザーがログインすると、電話がかかってきてAndroidがアプリを強制終了することを決定するたびに、ログインを行うことができなくなります。

これを処理する多くのiPhoneおよびAndroidアプリケーションがあります。通常は、ユーザーに手動でログインするように強制するのではなく、ログオン資格情報を保持するためです。

たとえば、アプリケーションを終了するときに更新を確認します

これは、どのオペレーティングシステムでも間違いです。ご存じのとおり、アプリケーションが「終了」している理由は、OSがシャットダウンしているため、更新プロセスが途中で失敗するためです。一般的に、それは良いことではありません。開始時に更新を確認するか、完全に非同期に(たとえば、スケジュールされたタスクを介して)更新を確認し、終了時は確認しません。

一部のコメントは、戻るボタンを押してもアプリがまったく終了しないことを示唆しています(上記の私の質問のリンクを参照)。

戻るボタンを押しても「アプリを終了」することはありません。ユーザーが[戻る]ボタンを押したときに画面に表示されていたアクティビティを終了します。

ユーザーが終了したい場合にのみ終了する必要があります-他の方法で終了することはありません。Androidでそのような動作をするアプリを作成できない場合、Androidは実際のアプリの作成には使用できないと思います=(

次に、Webアプリケーションもできません。または、WebOS(モデルを正しく理解している場合(まだモデルを使用する機会がなかった場合))。これらすべてにおいて、ユーザーは何も「終了」せず、そのままにしておくだけです。iPhoneは少し異なります。現在のところ、一度に実行できるのは1つだけです(いくつかの例外はあります)。そのため、離脱すると、アプリがすぐに終了します。

アプリケーションを本当に終了する方法はありますか?

他の誰もが言ったように、ユーザー(BACK経由)またはコード(経由finish())は、現在実行中のアクティビティを閉じることができます。ユーザーは通常、適切に作成されたアプリケーションについては、Webアプリケーションを使用するための「終了」オプションが必要とする以上のものは何も必要としません。


定義上、2つのアプリケーション環境が同じになることはありません。つまり、新しい環境が発生し、他の環境が埋没するにつれて、環境の傾向を確認できます。

たとえば、「ファイル」の概念を排除しようとする動きが高まっています。ほとんどのWebアプリケーションは、ユーザーにファイルを考えさせることを強制しません。iPhoneアプリは通常、ユーザーにファイルのことを考えさせません。Androidアプリは通常、ユーザーにファイルを思い込ませません。等々。

同様に、アプリを「終了」するという概念を排除しようとする動きが高まっています。ほとんどのWebアプリケーションは、ユーザーに強制的にログアウトさせるのではなく、一定時間操作がないと暗黙的にユーザーをログアウトさせます。Androidでも同じですが、iPhone(および場合によってはWebOS)でも同様です。

これには、ビジネス目標に焦点を当て、以前のアプリケーション環境に関連付けられた実装モデルに固執しないで、アプリケーション設計をさらに強調する必要があります。これを行う時間や傾向がない開発者は、既存のメンタルモデルを破壊する新しい環境に苛立ちます。これは、どちらの環境の障害でもありません。山を通過するのではなく、その周りを嵐が流れるための山の障害です。

たとえば、HypercardやSmalltalk などの一部の開発環境では、アプリケーションと開発ツールが1つのセットアップに混在しています。この概念は、(例えば、アプリケーションに言語拡張のあまり、外側にキャッチしていないVBAエクセルAutoCADでのLisp)。そのため、アプリ自体に開発ツールの存在を想定したメンタルモデルを思いついた開発者は、モデルを変更するか、モデルが成り立つ環境に限定する必要がありました。

だから、あなたが書くとき:

私が発見した他の厄介なことに加えて、私はAndroid用のアプリを開発することは起こらないと思います。

それは今のところ、あなたにとって、最高のことだと思われます。同様に、Androidで報告したのと同じ問題のいくつかがWebアプリケーションでも見つかる(たとえば、「終了」がない)ため、アプリケーションをWebに移植しようとしないように助言します。それとも、あなたは逆に、いつかあれば行うポートWebにあなたのアプリケーションを、Webアプリケーションのフローは、Androidのためのより良い試合になることを見つけることが、あなたはその時点でのAndroidのポートを再訪することができます。


21
私の頭の中に浮かんだ考えの1つ:アプリ全体をサービスとして書き直し、そのサービスを実際のアプリケーションとして扱う場合-おそらくそれはよりうまく機能しますか?次に、(Androidが望むように)アクティビティを「だまして」、サービスに含まれているデータのみを表示します。その場合、私はおそらくログイン状態やその他のものをそこに保持することができます。使用startForeground(int型、通知を)私はほとんどサービスを殺すからアンドロイドを停止することができますか...?
2010年

66
「私のユーザーは専門家であり、Androidに移植しようとしているアプリケーションを使用することのみを目的としてデバイスを使用していることに注意してください。」実際には、それ以外のことを示しています(「電話を受けるたびにそうすることはできません」-「電話」はアプリではありません)。さらに、独自のデバイスを構築しているのでなければ、他のアプリがインストールされないようにすることはできません。
CommonsWare 2010年

25
@SomeCallMeTim:いいえ、それはを使用する正当な理由ではありませんkillProcess()。より良いiOSコードを書くのは正当な理由です。
CommonsWare 2010年

24
@CommonsWare:すみませんが、それは私には役に立たないささいな答えです。私は移植に支払われたコードを移植しています。移植の2倍の時間を費やしてコードを書き直したり、雇用主のコストを削減し、より多くのゲームをより早くAndroidに置くことができるようにしたりする必要がありますか?いずれにしても、それは完全に学術的な質問です。私はiOSで変更をテストできないため、エンジンにこのような大きな変更を加えることを望んでいません。そして、それは単に間違っています。適切なオブジェクトにシングルトンパターンを使用することに「悪い」ことは何もありません。AndroidはWRT NDKアプリが壊れているだけです。
SomeCallMeTim 2010年

10
@Tedは、より信頼性の高い再初期化のために、アクティビティまたはサービス自体に保存される状態の量を最小限に抑えることができます。代わりに、ほとんどの状態とコードを、アクティビティまたはサービスが開始するたびに「最初から」再作成する個別のクラスに配置します。
Qwertie 2012

290

このスレッドの将来の読者のために、ここに修正を加えたいと思います。この特定のニュアンスは長い間私の理解を免れてきたので、私はあなたの誰もが同じ間違いを犯さないようにしたいと思います:

System.exit()スタックに複数のアクティビティがある場合、アプリは強制終了されません。 実際に起こるのは、プロセスが強制終了され、スタック上のアクティビティが1つ少なくなるとすぐに再起動されることです。これは、アプリが強制終了ダイアログによって強制終了されたとき、またはDDMSからプロセスを強制終了しようとしたときにも起こります。これは、私の知る限り、完全に文書化されていない事実です。

簡単に言えば、アプリケーションを終了する場合は、スタック内のすべてのアクティビティとfinish()、ユーザーが終了したいときにすべてのアクティビティを追跡する必要があります(いいえ、アクティビティスタックを反復処理する方法はありません) 、そのため、このすべてを自分で管理する必要があります)。これでも、実際にプロセスやぶら下がっている参照を強制終了することはありません。単にアクティビティを終了します。また、Process.killProcess(Process.myPid())うまく機能するかどうかはわかりません。私はそれをテストしていません。

一方、スタックにアクティビティを残しても問題ない場合はActivity.moveTaskToBack(true)、処理を非常に簡単にする別の方法があります。単にプロセスをバックグラウンドにしてホーム画面を表示するだけです。

長い答えには、この行動の背後にある哲学の説明が含まれます。哲学は多くの仮定から生まれました:

  1. まず、これはアプリがフォアグラウンドにある場合にのみ発生します。バックグラウンドにある場合、プロセスは正常に終了します。ただし、それがフォアグラウンドにある場合、OSはユーザーが自分のやっていることを何でもやり続けたいと考えます。(DDMSからプロセスを強制終了する場合は、まずホームボタンを押してから強制終了する必要があります)
  2. また、各アクティビティは他のすべてのアクティビティから独立していると想定しています。これは多くの場合、たとえば、アプリがブラウザアクティビティを起動する場合に当てはまります。これは完全に独立しており、ユーザーが作成したものではありません。ブラウザアクティビティは、そのマニフェスト属性に応じて、同じタスクで作成される場合と作成されない場合があります。
  3. それはあなたの活動のそれぞれが完全に自立していて、すぐに殺される/回復できると想定しています。(私はこの特定の仮定が嫌いです。私のアプリには大量のキャッシュデータに依存する多くのアクティビティがあり、サイズが大きすぎての間に効率的にシリアル化onSaveInstanceStateできないためですが、よくできているAndroidアプリの場合、これは当てはまります。あなたのアプリがいつバックグラウンドで終了するのかわからないからです。
  4. 最後の要因はそれほど仮定ではなく、OSの制限 です。アプリを明示的に強制終了することは、アプリがクラッシュすることと同じであり、Androidがアプリを強制終了してメモリを解放することと同じです。 これは私たちのクーデターグレイスで頂点に達します。Androidは、アプリが終了したか、クラッシュしたか、バックグラウンドで強制終了されたかを判別できないため、ユーザーが中断したところに戻ることを望んでいると想定し、ActivityManagerがプロセスを再起動します。

考えてみると、これはプラットフォームに適しています。まず、これは、プロセスがバックグラウンドで強制終了され、ユーザーがプロセスに戻ったときにまさに何が起こるかです。そのため、中断したところから再起動する必要があります。2つ目は、アプリがクラッシュし、恐ろしい強制終了ダイアログが表示された場合です。

ユーザーが写真を撮ってアップロードできるようにしたいとします。アクティビティからカメラアクティビティを起動し、画像を返すように要求します。カメラは(独自のタスクで作成されるのではなく)現在のタスクの一番上にプッシュされます。カメラにエラーがあり、クラッシュした場合、アプリ全体がクラッシュする必要がありますか?ユーザーの観点からは、カメラのみが失敗し、以前のアクティビティに戻す必要があります。したがって、スタック内のすべての同じアクティビティからカメラを除いて、プロセスを再起動するだけです。アクティビティ帽子をかぶったときに殺して復元できるように設計する必要があるため、これは問題になりません。それはとても残念ながら、すべてのアプリケーションは、そのように設計することができないですロマンガイや他の誰かがあなたに何を言っても、私たちの多くにとって問題です。したがって、回避策を使用する必要があります。

だから、私の最後のアドバイス:

  • プロセスを強制終了しないでください。どちらの呼び出しfinish()すべての活動やコールでmoveTaskToBack(true)
  • プロセスがクラッシュまたは強制終了した場合、そして私のように、現在失われているメモリ内のデータが必要な場合は、ルートアクティビティに戻る必要があります。これを行うにstartActivity()は、Intent.FLAG_ACTIVITY_CLEAR_TOPフラグを含むインテントで呼び出す必要があります。
  • Eclipse DDMSの観点からアプリを強制終了する場合は、フォアグラウンドに置かないようにしてください。そうしないと、再起動します。あなたは最初のホームボタンを押して、必要があり、その後のプロセスを殺します。

8
実際、私は再びAndroidを使い始めてから、すべてのアクティビティを終了し(いつでも1つのアクティビティだけがアクティブになります)、次にSystem.exit(0)を呼び出します。私のサービスで-そしてそれは私が望んでいるのと同じように機能します。私はほとんどの人が「それをしないでください」と言っているのを知っていますが、私はその動きで私が望む動作を正確に取得します...
Ted

13
プロセスを強制終了することは、たとえばネイティブコードを使用するゲームを作成する場合など、非常に役立つことがあります。プロセスを強制終了するとは、割り当てられたすべてのメモリを即座にシステムに解放することを意味します。
スルタン

10
気にする人のために、Process.killProcessはSystem.exit()とまったく同じ動作を示します
PacificSky

6
すべてのアクティビティを共通のAtivityBaseから派生させます。次に、アプリを強制的に閉じるフラグを保持します。onResumeで、強制的に閉じるフラグが設定されているかどうかを確認します。その場合はSystem.exit(0);を呼び出します。これにより、アクティビティスタック全体がカスケードされ、最終的にアプリが完全に閉じられます。
Nar Gar

12
実際の答えを提供してくれてありがとう(moveTaskToBack()私が探していたものでした)。だから多くの人が「あなたはアプリを終了したいと思ったことはありません」とだけ言っています。あなたがそれをしたい場合があるかもしれないと考えることさえせずに(例えば失敗したログイン)。
Timmmm

180

すべてのアプリケーションに終了ボタンがあります。そのため、ユーザーから肯定的なコメントを頻繁に受け取ります。アプリケーションが必要としないような方法でプラットフォームが設​​計されているかどうかは気にしません。「そこに置かないで」と言うのは、とんでもないことです。ユーザーが終了したい場合...私は彼らにそれを行うためのアクセスを提供します。私はそれがAndroidの動作をまったく低下させないと思い、良い習慣のように思えます。私はライフサイクルを理解しています...そして私の観察では、Androidはそれを処理するのに良い仕事をしていません......そしてそれは基本的な事実です。


15
+1残念ながら現時点ではそのような良い仕事をしていません(しかし、私は設計どおりにやってみたいので、私を困惑させてしまいます)
Richard Le Mesurier

25
終了するためにどのようなメカニズムを使用していますか?
ゲイリールドルフ

4
@Igor finish()-アクティビティを実行しても、アプリケーションは終了しません(アプリケーションを拡張します)。したがって、どのアクティビティもアクティブでなかった場合でも、設定はアクティブで実際のものであり、アクティビティがそれらにアクセスしようとすると、以前に使用されたものになります。System.exit(0); 一方、アプリケーションを強制終了するため、再起動すると、アプリは新たに設定を初期化する必要があります。これは、アプリケーションを手動で更新するときに必要です。データの形式を頻繁に変更し、それらをすぐに再起動する必要があるためです。
Nar Gar 2012

1
まあ、それが今私が必要としていることを達成する唯一の方法です。アプリの更新時にsystem.exitを使用します(そうしないと、コードの変更に基づいてシリアル化またはクラスキャストの例外が発生します)。ただし、system.exitを介してアプリを強制終了するためのUIハンドルをユーザーに提供しないことについて言及する必要があります。これは、アプリを完全にアンロードする必要がある場合にのみ使用するアプリのエンジニアとして予約されています。残りの時間は、単純なfinish()(またはデフォルトの戻るボタン操作)が使用されます。
Nar Gar 2012

13
ええ..「Android標準ではない」で地獄へ..Androidは強力なcozであり、人々は実験することができます..それが何かをするためのAPIを提供する場合、それがAndroid標準でないとどうして言えるでしょうか?私はそれらすべての「哲学的」な答えを消化することはできません。ユーザーを念頭に置いてアプリを作成します。彼らは満足しているか、彼らは、この機能を確認したい場合は、それはこれらのいわゆる哲学者はそれに反対している場合でも、それを実装するために絶対に大丈夫です場合...
ラーフル

144

アプリケーションをモノリシックアプリケーションとして考えるのをやめます。これは、ユーザーが「アプリケーション」やAndroidサービスを介して提供される「機能」を操作できる一連のUI画面です。

神秘的なアプリが「何をする」かを知らなくても、それほど重要ではありません。非常に安全な企業のイントラネットにトンネルし、監視や対話を実行し、ユーザーが「アプリケーションを終了」するまでログインしたままであるとします。IT部門が指示するため、ユーザーはイントラネットの内部または外部にいるときは非常に意識している必要があります。したがって、ユーザーが「終了」することが重要であるというあなたの考え方。

これは簡単です。通知バーに「イントラネットにいる、または実行している」と継続的に通知するサービスを作成します。そのサービスに、アプリケーションに必要なすべての機能を実行させます。ユーザーが「アプリケーション」とのやり取りに必要なUIのビットにアクセスできるように、そのサービスにバインドするアクティビティを用意します。また、Androidメニュー-> [終了](またはログアウトなど)ボタンを押して、サービスを終了し、アクティビティ自体を閉じます。

これは、すべての意図と目的のために、まさにあなたが望んでいることです。Androidのやり方を実行しました。この「出口」の例として考えられる可能性については、GoogleトークまたはGoogleマップナビゲーションをご覧ください。唯一の違いは、ユーザーがアプリケーションを復活させたい場合に備えて、アクティビティから[戻る]ボタンを押すと、UNIXプロセスが待機する可能性があることです。これは、最近アクセスしたファイルをメモリにキャッシュする最新のオペレーティングシステムとまったく同じです。Windowsプログラムを終了した後、必要とされた可能性が最も高いリソースはまだメモリ内にあり、他のリソースがロードされているため、不要になったため、他のリソースに置き換えられるのを待っています。Androidも同じです。

あなたの問題は本当にわかりません。


3
@エリック、あなたはそれから逃げているのであなたは問題をません。古い「プログラムモデル」で実行される別のプログラムを利用して、「Androidモデル」では実行できないことを実行しただけです。「Androidモデル」の問題を確認するには、Linux / Windowsボックスにタスクを委任する余裕がないと想像する必要があります。「Androidモデル」を実行するボックスのみを使用して、最前端から最後端まですべてを実行する必要があると想像する必要があります。次に、「Androidモデル」の制限が空と同じくらい明確であることがわかります。
Pacerier 2014年

アプリケーションをモノリシックアプリケーションと考えてください。それは単一のJVM(Java仮想マシン)プロセスによって実行されているjavaで書かれています。System.exit()はJVMを終了し、すべてのUI画面とすべてを完全に完全に終了します。これの例外は、プログラマーが複数のプロセスで実行される複数のスレッドを設定する問題に直面した場合です-しかし、デフォルトではそうではなく、Googleによると、通常は行われるべきではありません。
Jesse Gordon

@JesseGordonこれは真実ではありません。System.exit()スタックからアクティビティのみを削除します。JVMはすぐに再初期化されます。この回答を参照してください。
forresthopkinsa 2017年

1
@forresthopkinsa OKアンドロイド7.0でテストしました。単純なシングルスレッドアプリは、専用のJVMインスタンスで引き続き実行され、そのアプリに固有のユーザーIDとして実行されます。このテストでは、まだマルチスレッドアプリを試していません。そして、System.exit()STILLは、そのアプリのJVM全体を強制終了します。System.exit()がプライマリアクティビティから呼び出されると、終了します。System.exit()がサブアクティビティから呼び出された場合でも、JVMは強制終了されますが、androidはメイン/最初のアクティビティで新しいプロセスIDの下でJVMを再起動します。android.os.Process.killProcess(android.os.Process.myPid()); kill <pid>も同じように機能します。
ジェシーゴードン

1
興味深い..リンクした回答@forresthopkinsaを見ると、AndroidはWebブラウザーのように動作しており、system.exitの後にアクティビティを復元しているため、ユーザーが終了したことに気付かないが、終了の原因となったアクティビティは除外されている。 。?変だ。しかしとにかく、System.exit() すべてのアクティビティを閉じ、free()がメモリを閉じて、そのアプリのJVMを終了します。しかし、私はAndroidがそれを再起動/復元するためにどのようなふざけた態度をとるかはわかりません。アプリキラーアプリを阻止することですか?したがって、誰かが終了ボタンを必要とする場合は、メインアクティビティに配置する必要があります。
ジェシーゴードン

71

これは非常に多くの専門家が貢献している興味深い洞察に満ちた議論です。この投稿はAndroid OSのコアデザインの1つを中心に展開しているため、Android開発のメインWebサイト内からループバックする必要があると思います。

ここに2セントも加算したいと思います。

これまでのところ、Androidのライフサイクルイベントの処理方法に感銘を受け、ネイティブアプリにWebのようなエクスペリエンスのコンセプトをもたらしました。

とは言っても、Quitボタンがあるべきだと私はまだ信じています。どうして?...私やTed、またはここにいる技術の達人ではなく、エンドユーザーの要求を満たすことのみを目的としています。

私はWindowsの大ファンではありませんが、長い間、ほとんどのエンドユーザーが慣れている(Xボタン)という概念を導入しました。

これは、誰か(OS、開発者?)が独自の裁量で処理することを意味するわけではありません...それは単に「慣れている私の赤いXボタンはどこにあるのか」を意味します。私の行動は、「ボタンを押すと通話を終了する」、「ボタンを押してデバイスの電源を切る」などに似ているはずです...それは知覚です。それは私の行動が実際にその目的を達成すること自体に満足をもたらします。

開発者はここで与えられた提案を使用してこの動作を偽装することができますが、認識はまだ残っています。つまり、アプリケーションは、エンドユーザーからの要求に応じて、独立した信頼できるニュートラルソース(OS)によって(今は)完全に機能を停止する必要があります。


2
正しい。Good ol 'Windows Mobileは、Windows PCと同じXボタンを提供しましたが、実際にアプリを終了せず、「スマートに最小化」しただけです。多くのユーザーは、おそらくアプリが本当に終了しなかったことを知りませんでした。(.NET Compact Frameworkを使用した場合、これが発生したことはアプリに通知されず、リソースを解放するか、実際に終了するオプションがありませんでしたが、
アプローチはうまくいき

3
実際、これはユーザーに嘘をつき、暖かくぼんやりした感じを与えることになります。究極的には、過去の遺物が道端に落ちるようにしておく方がいいでしょう。モバイルとウェブは新しいプラットフォームであり、デスクトップと同じように動作することは期待されていません。そして、偶然にも、少なくともAndroidのライフサイクルの決定はユーザーに追いついているようです。私の最大のアプリが2周年を迎えるにつれ、「終了」ボタンに対するエンドユーザーの要求の流れが慣れてくると乾いてしまうことに気づきました。新しいプラットフォーム。
Jon O

2
@ジョンあなたは何をお勧めしますか?アプリのどこかに「終了」オプションを提供していませんか?
IgorGanapolsky

まあ、ユーザーが終了ボタンを要求したときに、デスクトップとは異なる動作をする方法を正確に説明します(これは、タスクキラーについて言及するときに説明するのと同じです)。現在、情報は追いついているようで、私はそれらの要求をもう受け取りません。だから、私はあなたにそれを数回説明することをお勧めします(多分缶詰の応答を思い付くでしょう)そしてボタンを省くことです。または、出口ボタンがない理由を説明するダイアログを開く偽の出口ボタンを配置します。:D(Android 4以降では、ユーザーはアプリをマルチタスクディスプレイから「オフ」にスワイプして「キル」できます。)
Jon O

3
また、「プロセスを終了しないでください」というすべてのアドバイスの背後にある理由を見つけていません。私の意見では、顧客は常に正しいので、それが要求された後に終了ボタンを提供し、「ユーザーに温かくぼんやりした感じを与えるために嘘をつく」ことは何が問題なのでしょうか?これは、良いアプリを書くことのすべてです。ほとんどのユーザーは、実際に何が起こっているのか知りませんし、気にしませんが、アプリが気に入って期待どおりの結果が得られれば、戻ってきてアプリを購入します。それが私たちみんなが望んでいることですね。それとも何か不足していますか?
DDSports 2014

37

あなたはでき押すことによっていずれか、終了Backボタンをか呼び出すことでfinish()、あなたにActivity。明示的に終了したい場合finish()は、から呼び出してMenuItemください。

Romainは、それが無意味だというだけで、それを実行できないとは言っていません。ユーザーは、アプリケーションのライフサイクルが機能する方法によって、自動的に保存および何が起こってもその状態を復元します。


5
目的を満たしていても意味がありません。アプリケーションではそれを行います。たとえば、アプリケーションを終了するときに更新を確認したいとします。アプリを終了できないため、更新を行うことができません。一部のコメントは、戻るボタンを押してもアプリがまったく終了しないことを示唆しています(上記の私の質問のリンクを参照)。
2010年

2
Romainが言うように、それはコアアプリケーションの動作方法ではありません。したがって、ユーザーが「戻る」を押してアプリを終了することに慣れている場合、明示的に「終了」を選択するのではなく、アプリを続行する可能性があります。起動時、またはonDestroy()で更新チェックを実行したり、繰り返しアラームを使用したりできます。これは、ユーザーがトリガーする必要があるものではないようです。
Christopher Orr

1
トム:ほぼ5年間、Windows Mobileのコーディングを行っています。それは「限られた資源」を備えた電話です。そこではそのような振る舞いはなく、あの「兄貴」的なやり方でも行動しないという問題はありません。「本当のアプリ」=プログラマーがそれをはるかに制御できる場所、つまりGUIの要素が削除されたときに終了するなど
Ted

1
ジェイ:それがまだメモリに残っていると、私が考えているアプリを更新できないからです。使用中のdelelteファイルは使用できませんか?開始時にユーザーに更新を強制することができないので、終了時に更新したいと思います。それは彼らがどのように働き、何が必要かと関係があります。シフトの開始時にさまざまな理由で更新を強制されることは問題です。少し複雑です。
テッド

1
ジェイ:いいえ、私が先に述べたように、それはマーケットアプリではなく、それもそうではありません。これは非常に特殊なアプリであり、一般的な使用向けではありません。
2010年

31

この議論は、開発者が最もよく知っているのか、それともユーザーが最もよく知っているのかという昔からの疑問に要約されます。ヒューマンファクターのあらゆる分野のプロのデザイナーが、毎日これに苦労しています。

テッドは、市場で最もダウンロードされたアプリの1つが「アプリキラー」であることを指摘しました。アプリケーションを終了すると、人々は少し余分なセロトニンを摂取します。彼らはデスクトップ/ラップトップでそれに慣れています。それは物事を速く動かし続けます。プロセッサーを冷却し、ファンがオンにならないようにします。消費電力が少なくなります。

モバイルデバイスがはるかに小型の船であると考えると、「不要になったものを船外に捨てる」という彼らのインセンティブに特に感謝することができます。現在、Androidの開発者たちは、OSが最もよく知っており、アプリを終了することは骨董品であると推論しています。私はこれを心からサポートします。

ただし、ユーザーの不満が自分の無知から生まれたとしても、ユーザーを不満にすべきではないと私は思います。そのため、ビューを閉じる以外に何もしないプラセボボタンであっても、「終了」オプションを使用することは良いデザインであると私は結論付けています。


8
はい、「Quit」ボタンがあることは確かにユーザーフレンドリーです。ユーザーが5つのアクティビティの奥深くにある場合、ユーザーは他にどのようにアプリを終了しますか?確かに彼らは何度も押し返すことができますが、私は彼らがそれを望んでいないと思います。
IgorGanapolsky

4
たったの5?Android 2.2 Webブラウザーでは、最終的に終了するまで[戻る]ボタンをタップするのに数分かかります
Joe Plante

3
Androidの開発者が機能するメモリマネージャーを開発するとき、私は彼らの話を聞き始めます。Froyoの時点では、それは非常に貧弱に機能し、ランダムなアプリを殺し、必要のない(そしてそれらを合法的に開始する意図がない)アプリを再起動し、OTOHはメモリが50MBの空き容量に達したときに完全なクロールまで遅くなります。
DVK 2012年

10
Androidタスクキラーは「不要」であると宗教が述べているが、ATKを使用してビジネスを実行していないダムタスクを強制終了すると、OSが通常の速度の1〜5%でクロールされなくなり、通常の速度の100%に戻ります(測定)システムが50MBの無料ローエンドに到達するたびに、2年間で数千回のATK使用にわたって100%の時間、あなたの宗教は間違っています
DVK

@JoePlante最初に開いているすべてのタブとウィンドウを閉じてから、[戻る]ボタンを1回押すだけで終了できます:)少なくとも私のGS2では。
ldam 2013

29

テッド、あなたが達成しようとしていることは、おそらくあなたが今それをどう考えているのかではなく、実行することができます。

アクティビティとサービスを読むことをお勧めします。「アプリ」という用語の使用をやめ、コンポーネント、つまりアクティビティ、サービスの参照を開始します。Androidプラットフォームについてもっと学ぶ必要があると思います。それは、標準的なPCアプリからの考え方の変化です。あなたの投稿に「アクティビティ」という単語(FAQの引用にない、つまりあなたの単語ではない)が含まれていないという事実から、さらに読む必要があることがわかります。


私はandroid.com =)でほとんどのものを読みました、そして私は私が活動について話す私の質問のいくつかにリンクすることができます、それでそれは真実ではありません(例:stackoverflow.com/questions/2032335/…またはstackoverflow.com/questions/ 2032335 /…など...)ただし、最後にもう1つあげて、サービスとしてwho "app"を作成しようとするかもしれません...
Ted

4
アプリにはサービスとアクティビティを含めることができ、アプリには両方が必要なようです。アクティビティはUI部分のみです。
アーロン、

23

ブログ投稿Androidアプリに終了ボタンを含めるタイミング(ヒント:なし)は、私ができるよりはるかに優れています。私はすべてのAndroid開発者がそれをすでに読んでいることを望みます。

抜粋:

私の経験では、[ユーザー]が本当に望んでいる ことは、アプリがリソース(バッテリー、CPUサイクル、データ転送など)の消費を停止することを保証する明確な方法です。

多くのユーザーは、終了ボタンがこの要件を実装していることを認識し、追加するように求めています。開発者は、ユーザーを喜ばせたいと考えて、必然的に1つ追加します。その後まもなく、どちらも失敗します。

  • ほとんどの場合、終了ボタンは単にを呼び出しますActivity.finish()。これは、戻るボタンを押すのとまったく同じです。 丁度。 サービスは実行し続け、ポーリングは継続して行われます。ユーザーはアプリを殺したと思っているかもしれませんが、殺していないため、すぐにさらに迷惑になります。
  • 出口の動作があいまいです。終了ボタンでアクティビティを閉じるだけにする必要がありますか、それとも関連するすべてのサービス、レシーバー、およびアラームを停止する必要がありますか?何をすべきBackHome代わりにヒットするとどうなりますか?アプリにウィジェットがある場合はどうなりますか?終了ボタンで更新も停止する必要がありますか?

解決策は、戻るボタンが期待どおりに動作するようにすることです。さらに良いのは、アプリが表示されていないときにリソースの消費を停止することです。

先に進んで、記事全体を読んでください。


3
終了と戻るは常に同じ目的で使用されるわけではありません。たとえば、Pandoraを見てみましょう。このアプリを終了するために逆戻りしても、アプリは終了しません(サービスとしてバックグラウンドで再生され続けます)。
IgorGanapolsky

@IgorG。音楽プレーヤーアプリには、アプリを終了するための[終了]ボタンではなく、音楽の再生を停止するための[停止]ボタンが必要です。
Dheeraj Vepakomma 2012

Pandora、iHeartRadio、Spotify、Jango、その他の音楽ストリーミングアプリを使用したことがありますか?それらにはすべて終了ボタンがあります。音楽の再生を停止することは、アプリを終了することと同じではありません。特に、通知バーでサービスを実行している場合。
IgorGanapolsky 2012

2
神話的であろうとなかろうと、原始的なユーザーであろうとなかろうと、しかしほとんどすべてのUIソフトウェアは-どのプラットフォームとOSでも-終了/閉じる/終了ボタンを実装しています。他にどのように実装しますか?
IgorGanapolsky 2012

3
@ DheerajV.S。、アプリが表示されないときはいつでもリソースの消費を停止するだけですか?悪いアドバイス。 非常に。 非常にx99。自分に写真をメールで送信しようとするときはいつでも、アプリを5分間表示し続ける必要があります。最小化すると、写真のメール送信が停止するためです。正解です。アプリが表示されている場合にのみ実行する必要があると考える開発者がいるため、スマートフォンを5分間使用できません。今.....ビデオのような大きなファイルを送信想像
Pacerier

21

回答:(Romain Guy):ユーザーは処理しません。システムがこれを自動的に処理します。それがアクティビティのライフサイクル(特にonPause / onStop / onDestroy)の目的です。何をする場合でも、「終了」または「終了」アプリケーションボタンを配置しないでください。Androidのアプリケーションモデルでは役に立たない。これは、コアアプリケーションの動作にも逆です。

1:アプリケーションを完全に終了することは、通常は必須ではないかもしれませんが、役に立たないわけではありません。ウィンドウに終了オプションがない場合はどうなりますか?メモリがいっぱいになり、OSがどのプログラムで処理したかを推測しなければならないため、システムの処理速度は遅くなります。Romain Guyや、Larry PageやSergey Brinが何を言っているかは気にしません。これらは疑いのない事実です。新しいアプリを起動する前にメモリを取得するためにタスクを強制終了しなければならない場合、システムの実行速度は遅くなります。アプリを強制終了するのに時間がかからないとは言えません!遠くの星からの光でさえも時間がかかります... ユーザーがアプリを完全に閉じることを許可することにいくつかの用途があります。

2:コアアプリケーションの動作に反していますか?それはどういう意味ですか?私が今のところアプリを実行し終えたとき、それはもはや何の仕事もしていない...それは、そのメモリが必要とされるとき、OSによって殺されるのを待っているだけです。

要約すると、最小化と終了には明確な違いがあり、どちらもピンチヒットがうまく機能しません。すべてのネジにドライバーを残しますか?またはすべてのドアの鍵?ブレーカーが吹くまで別のアプライアンスをオンにする必要があるまで、すべてのアプライアンスを高いままにしますか?食器洗い機に食器をいっぱいにして、新しい汚れたもののためのスペースを作るのに十分なだけ毎回取り出すのですか?私たちが私道まで走っている車をすべてそのままにしますか?

ユーザーがアプリを最小化したい場合、最善の方法はアプリを最小化することです。ユーザーがアプリを終了する場合は、必ず終了するのが最善です。

眉をひそめていますか?それはAndroidの見解です-彼らはそれに眉をひそめています。そして、多くの独立した新人Android開発者がそれに眉をひそめています。

しかし、それには、良いコーディングと悪いコーディングがあります。良いプログラムフローモデルと悪いプログラムフローモデルがあります。

ユーザーがプログラムを使い終わったことをユーザーが知っているときに、プログラムをメモリに残しておくのは、プログラムの流れとしては適切ではありません。まったく目的がなく、新しいアプリを起動したり、実行中のアプリがより多くのメモリを割り当てたりすると、動作が遅くなります。

自動車のようなものです。ストップライトで停止したり、ファストフードドライブを通過したり、ATMで停止したりするなど、車を走らせたままにする場合があります。しかし、あなたがそれをシャットオフしたい他の状況があります-あなたが仕事に着いたとき、または食料品店や家さえです。

同様に、ゲームをプレイしているときに電話が鳴った場合も同様です。ゲームを一時停止し、実行し続けます。ただし、ユーザーがしばらくゲームを終了した場合は、必ずユーザーを終了させて​​ください。

一部のアプリケーションの終了ボタンは、他のアプリケーションよりも前面に表示されます。たとえば、ゲーム、またはユーザーが完全に終了する可能性が高いプログラムには、明確な終了が必要です。(おそらくメールをチェックし続けることができるように)終了があまり望めない、おそらく電子メールプログラムのような他のプログラム-これらのプログラムは、終了オプションを使用して主要な制御入力画面スペースを無駄にすべきではありませんが、良好なプログラムフローのためには、終了オプションが必要です。誰かがカバレッジエリアが悪いときや、Skype通話などでメールプログラムがメールをチェックしたくないと決めた場合はどうなりますか?必要に応じて、メールプログラムを終了させます。

一時停止と終了は2つの重要なタスクであり、どちらも他方の役割を果たしません。


2
「ユーザーがアプリを最小化したい場合は、アプリを最小化するのが最善です。ユーザーがアプリを終了したい場合は、必ず終了するのが最善です。」-(10年以上の経験に基づいた)事柄があります。ユーザーは、自分が何を望んでいるのかほとんどわかりません。あなたが彼らを助けなければ、あなたはそれを変えなければならないでしょう。上記のサンプルについて:他のサンプルを挙げましょう。あなたは車で作業していて、テーブルを手元に置いています。キャビネットに必要なすべてのツールを常に正しい場所に保管するか、最もよく使用するツールを手元に置いていますか?そして、新しいもののために場所を空けるために、大きく遅れて使用されたものを片付けますか?
HoGo 2017

4
HoGo、コメントありがとうございます。当然、私はそうは思いません。具体的には、私が言える限りでは、何をすべきかわからないユーザーがいるため、何をすべきかを知っているユーザーであっても、何をすべきかをユーザーに許可してはならないという見方です。Androidがアプリを最小化する代わりにアプリを終了する必要があるかどうかを正確に知る方法があった場合は、問題ありません。ただし、そうではなく、すべてのユーザーが終了するときに常に最小化して生活することを強いると、デバイスのパフォーマンスが低下します。
ジェシーゴードン

重要なのは、1つのアプリを起動したときにメモリがない場合、システムは最後のアプリを強制終了する必要があることをシステムが認識していることです。ユーザーはそれを知らないはずです。あなたはあなたがそれを望んでいるのはあなたが人間であるので、それはあなたが制御下にある伐採、その単なる愚かな筋肉の記憶、プログラムを閉じる必要のない無意味な制御のようなものだからです。コンピューターは自動化するために発明されました。WindowsがAndroidのように機能し、自動的に閉じるようにしたいのですが、保存して終了することを忘れないでください。それはばかげています。なぜ、ユーザーがそうする必要があるのでしょうか。コンピュータは自分のメモリを管理する必要があります、私は他に管理する必要があります。
Luiz Felipe

実際、Windowsマシンではプログラムを閉じず、32 GBのRAMを搭載しています。すべてを実行したままにし、作業が終了したらプログラムを閉じます。なぜプログラムを閉じて、5分後にもう一度開くのか、これは意味がありません。レスポンシブになるまで2分かかる大規模なC ++プロジェクトについて考えてみます。VisualStudioを永久に開いたままにしておきます。また、15日間開いた後もクラッシュしないことを期待しています(そのため、ECCメモリを使用しています)。
Luiz Felipe

マシンショップとの類似性は良いものです。最もよく使用するツールを机の上に置いておきます。ツールを選んで使用するのではなく、毎回元に戻します。また、私はその日を始めません。コンピューターの電源を入れ、それが始まるのを待ち、IDEを開きます。実行したままにしておくと、最新のコンピューターは40wでアイドル状態になる可能性があります。なぜ閉じるのですか?また、コンポーネントの摩耗が少ない(突入電流がなく、EEはそれを知っている:))
Luiz Felipe

19

問題は、バグのあるソフトウェアがない限り、アプリを終了する必要はないということです。Androidは、ユーザーがアプリを使用していないときにアプリを終了し、デバイスがより多くのメモリを必要とします。バックグラウンドでサービスを実行する必要があるアプリがある場合、サービスをオフにする方法が必要になる可能性があります。

たとえば、アプリが表示されていない場合でも、Google Listenはポッドキャストを再生し続けます。しかし、ユーザーがポッドキャストを使い終わったら、ポッドキャストをオフにするための一時停止ボタンが常にあります。私が正しく覚えている場合、Listenは通知バーにショートカットを配置しているので、いつでも一時停止ボタンにすばやく移動できます。別の例としては、インターネット上のサービスを絶えずポーリングするTwitterアプリなどのアプリがあります。これらの種類のアプリでは、サーバーをポーリングする頻度、またはバックグラウンドスレッドでポーリングするかどうかをユーザーが実際に選択できるようにする必要があります。

終了時に実行するコードが必要な場合は、必要に応じてonPause()、onStop()、またはonDestroy()をオーバーライドできます。 http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


5
私が発見した他の厄介なことに加えて、私はAndroid用のアプリの開発は起こらないと思います。あまりにも「兄貴」のようなことが起こっており、Androidが実行すべきアプリかどうかを教えてくれます。私はプログラマーとして、Googleやandroidではなく、その選択をする必要があります=(
Ted

3
アクティビティ(アクティブなユーザーインターフェイス)は、別のアプリケーションが上に表示されたり、押したり戻したりすると消えます。ユーザーはそれらと対話していないので、ユーザーが長時間戻ってこない場合などに備えて、状態を保存するのが最も安全です。Serviceデータプッシュなどを受信するなど、進行中の作業をバックグラウンドで実行し続けるために、執筆を妨げるものは何もありません。別のアプリを使用している場合でも、Googleトークは機能を停止しません。音楽プレーヤーと同じです。そこにある他のアプリとその機能を見てください。
Christopher Orr

3
資格情報を保存して、ユーザーが電話を受けたりアプリを離れたりするたびにログインする必要がないようにする必要があります。Androidのライフサイクルを確認することをお勧めします。アプリが一時停止、停止、または破棄された場合、関連するすべてのデータを保存できるため、アプリを再度開いたときに、アプリから離れた状態になります。ユーザーは、アプリが停止されたことを知る必要さえありません。
ジェイアスクレン

1
ユーザーは、リソースを集中的に使用するアプリケーションをいくつか終了したいと思うかもしれません。一時停止したときにリソースの使用量を減らすだけでよいかもしれませんが、それが常に可能であるとは限りません
Casebash

1
この質問はまだ生きています。育ててから4年後=)実際にサービスとしてバックグラウンドで実行しましたが、まだ4年後-それが必要だと感じたので、終了ボタンを追加しました。そして重要です。そして、それを搭載したアプリも増えています(たとえば、Skype)。
テッド

19

データ/接続(および「アプリケーション」)を永続化する方法を理解できない場合、Androidで「必要な」ことを行うことができなくなります。

これらのかわいらしい小さなアプリキラーをダウンロードする人は、通常、バッテリーの寿命やメモリの使用には役立ちませんが、OSがメモリを効率的に管理するのを妨げます...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


タスクキラーについて話している間、非常に啓発的な投稿が数日前にAndroid redditに掲載されました。要点は、タスクキラーを慎重に使用することです。そうしないと、実際にバッテリ寿命が低下
Neil Traft

@Neil Traft、この投稿へのコメントは非常にわかりやすいものでした。店舗の営業担当者は、顧客にタスクキラーを推奨およびインストールしています:)
dipu

3
@ Dan、1週間処理したアプリを完全に終了して、Android OSの仕事が妨げられる可能性がありますか?したがって、より多くの空きメモリがあります。それはおそらくアンドロイドを妨げることはできません!ただし、後で速度が上がる可能性があります。しばらくアプリを使い終えたことがわかっている場合、それはまったく何の目的も果たしません。メモリを消費するだけで、遅かれ早かれ新しいアプリを起動します。OSは、WEEKSの前に知っていた一部のアプリを強制終了しなければならないため、追加の遅延が発生します。
ジェシーゴードン

@ジェシーゴードン、アプリを終了した後の実際のプロセスを見ましたか?それらは再起動され、OSは問題があったと想定します... OSはメモリを必要とするときにアプリを強制終了します。ここで言及された記事に投稿されたものを読んだことはありますか?
Dan

@ Dan、Androidがこのようなことをするだろうと考えるために...それは本当にいくつかの真剣な白塗りの再教育を必要とします。
Pacerier 2014年

18

Addison-Wesleyが発行している「Android Wireless Application Development」を読んでみてください。私はちょうどそれを仕上げています、そしてそれは非常に徹底しています。

Androidプラットフォームに関するいくつかの根本的な誤解があるようです。私も最初はAndroidアプリのアプリケーションライフサイクルに少し不満を感じていましたが、理解が深まり、このアプローチを本当に楽しむようになりました。この本はあなたの質問のすべてとはるかに答えます。それは本当に私が新しいAndroid開発者のために見つけた最高のリソースです。

また、既存のアプリのラインごとの移植を手放す必要があると思います。アプリケーションをAndroidプラットフォームに移植するために、アプリケーションの設計の一部が変更されます。モバイルデバイスはデスクトップシステムに比べてリソースが非常に限られており、Androidデバイスが複数のアプリケーションを整然としたリソース認識方式で実行できるようにするため、使用されるアプリケーションライフサイクルが必要です。プラットフォームについてさらに深く調べてみてください。そうすれば、自分がやりたいことが完全に実現可能であることに気付くでしょう。幸運を祈ります。

ちなみに、私はAddison-Wesleyやこの本に関連する人物や組織とは何の関係もありません。私の投稿をもう一度読んだ後、私は少しファンボーイっぽくなったように感じました。私は本当に本当に本当に楽しんで、それが非常に役に立ったと感じました。:)


2
本のヒントをありがとう。可能な場合、およびAndroidポートへの移行を決定した場合は、それを確認します。もう一度言いますが、コンピュータに関しては、ユーザーは最新ではありません。たとえば、AndroidのNotificationBarを使用するのは非常に難しいでしょう。小さすぎる(彼らは大きな指を持っている)。彼らにとっては別の世界なので、ユーザーのためのオプションなしでシンプルにする必要があります。そのことを念頭に置いて.NETソリューションを構築しました-それらに選択肢を与えないでください=)
Ted

聞いています。ほとんどのユーザーは技術的にあまり賢くないと想定する必要があります。
Andy

8
モバイルデバイスの「リソース」がどれほど少ないかというマントラにうんざりしています。目を覚ます、それらは500Mhz以上で実行されており、メモリの負荷があります。私の古いDell Aximには128MBのRAMがありました。現在市販されているデバイスは、通常512RAMを超え、1GHZで動作します!それは私の古いPentium 90Mhzの10倍であり、「非常に限られたリソース」と言っているpplはこれまでも聞こえませんでした。目を覚ましてコーヒーの香りがするその時が来ました-私たちは今80年代ではなく2010年にいます。
2010

16

ほぼ99%の時間で、Androidアプリケーションが自身のライフサイクルを引き継ぐ必要はありません。ほとんどの場合、それはアプリケーションのより良い計画またはよりスマートな設計に帰着します。たとえば、ダウンロードなどを処理する内部サービス(エクスポートされない)を構築するか、ユーザーワークフローに関連するアクションとタスクを設計します。

しかし、言われていることには、意志があるところに道があります。Androidが提供する-android.os.Processクラスを介して、基盤となるプロセスを制御するためのJavaよりもはるかに優れたAPI。そして、Javaとは異なり、単純なjava.lang.System.exit()呼び出しの背後にすべてを隠すことで、開発者をmoronのように扱いません。

では、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でタスクキラーを使用しないでください)。


はい、私がここに来たのは、ある状況でアプリを閉じたかったためです。OBBデータキャッシュが破損していて、アプリ全体を再起動する必要があります
Luiz Felipe

14

Androidでアプリケーションを考案すると、次のように見えます。

  • アプリケーションで作業しています
  • 電話が鳴りました
  • あなたは電話に出る
  • 通話の最後に、以前と同じ場所でアプリケーションに戻ります。

そのためには、BackボタンまたはHome電話のボタン(短押しまたは長押し)と通知バーのみが必要です。

アプリケーションを終了するときはBackHomeボタンまたはボタンがなくなるまでボタンを使用します。

これが、ほとんどのアプリケーションが考えられる方法だと思います。しかし、何らかのセッションや接続が必要な場合は、ログイン/ログアウトボタンと通知(タイトルバーなど)を使用してユーザーに明確に示しました。これは、純粋な「exit」スタイルのアプリケーションとはかなり異なるスタイルです。

PCにはマルチGUIデスクトップがあり、Androidには明らかにマルチタスクがありますが、一度に1つのアプリしか表示しません(ここではウィジェットは考慮しません^^)。また、携帯電話では、いつでも、自分がしていることよりも重要なことについて通知を受けることができます。

したがって、アプリケーションの全体的な概念は、「アプリケーションに入る-仕事-アプリケーションの終了」とは異なる何かに依存しています。


12

うーん...

Androidアプリが正しい方法で表示されていないだけだと思います。あなたはあなたが望むものとほぼ同じようなことを簡単に行うことができます:

  • 開発者のライフサイクルのドキュメントで推奨されているように、アプリアクティビティで状態を保存/復元します。

  • 復元段階でログインが必要な場合(ログイン/セッション情報が利用できない場合)、それを実行します。

  • 最終的にボタン/メニュー/タイムアウトを追加します。この場合finish()、ログインやその他のセッション情報を保存せずにを実行し、暗黙的にアプリセッションを終了します。そのため、アプリが起動/前面に戻ると、新しいセッションが開始されます。

そうすれば、アプリが本当にメモリから削除されているかどうかを気にする必要はありません。

本当にそれをメモリから削除したい場合(これはお勧めできませんが、BTWはどのような目的で使用しますか?)、最後にonDestroy()with java.lang.System.exit(0)(またはおそらくrestartPackage(..)?)で条件付きで削除できます。もちろん、これは「本当にアプリを終了する」場合にのみ行ってください。これonDestroy()は、アプリの終了ではなく、アクティビティの通常のライフサイクルの一部であるためです。


11

Androidコンテキストのアプリケーションは、漠然と関連するアクティビティの集まりにすぎないため、アプリケーションを終了しても、あまり意味がありません。アクティビティをfinish()すると、アクティビティスタック内の前のアクティビティのビューが描画されます。


2
アプリケーションを終了することは、状況によっては理にかなっています。1か月に数回、数分間使用するプログラムの場合、アプリを完全に終了することには疑問のない利点があります。その利点は、OSがメモリを使い果たして電話が鳴り、応答ボタンを押した後、1週間後にそのアプリを終了するために時間をかける必要がなく、Androidがメモリを解放するのを待っていることです。たとえば、電話に出ることができます。または、メールを受け取ってそれを読みたい場合は、OSが最初に解放しないと、より多くのメモリを必要とするアプリケーションがより速く起動します。
ジェシーゴードン

3
@JesseGordonの発言、およびこの理由による別の理由による終了:このリソースを大量に消費するアプリを終了しないと、1か月間使用しないことがわかっている場合、OSが他のアプリを誤って強制終了することがありますリソースが不足しているときに、この役に立たないリソースホグアプリを実行したままにします...他のアプリの再開に必要以上に時間がかかります。
ドンハッチ

10

私はテッドに同意します。アプリケーションを終了することは「Androidの方法」ではないことを理解していますが、除外する必要はないようです。(アクティビティだけでなく)アプリケーションを実際に終了する必要がある3つの理由を次に示します。

  1. ユーザーは、メモリが少ない場合にどのアプリを強制終了するかを制御したい場合があります。重要なアプリAがバックグラウンドで実行されている場合、アプリAがオペレーティングシステムによって強制終了されないように、アプリBを使い終わったら終了します。

  2. アプリケーションの機密データがメモリにキャッシュされている場合は、ウイルス/ワーム/不正アプリがアクセスできないようにアプリを強制終了することができます。私はセキュリティモデルがそれを防ぐことになっていることを知っていますが、念のために...

  3. アプリケーションが、電話に悪影響を与える可能性のあるリソース(ネットワーク、CPU、センサーなど)を使用している場合、それらのリソースを確実に解放する1つの方法は、アプリケーションを終了することです。適切に動作するアプリは、不要になったときにリソースを解放する必要があることを理解しています。しかし、繰り返しになりますが、アプリケーションを終了することは、それを確実にするための合理的な方法のようです。


6
「アプリケーション」を表すと思いますか?Facebookアプリを開いて新しいプロフィール写真を設定すると、カメラアプリまたはギャラリーアプリが起動します。ユーザーとして、私はまだ同じタスクを実行しています(Facebookを使用)。Facebookを閉じることにした場合、カメラとギャラリーのアプリも閉じる必要があります(これらはFacebookから起動されたアクティビティであるため)...他のいくつかの写真の編集中にFacebookを閉じることのみを意図していた場合はどうなりますか? ?問題を潜在的なデータ損失にシフトすることになります。
seanhodges

まあ、私はそれがデータ損失まで行くことができるとは思いません。自分のアクティビティと同じタスクで実行されているサードパーティのアクティビティがあり、自分のアクティビティが終了ボタンのあるアクティビティである場合、ユーザーはfinish()終了ボタンを押す前にサードパーティのアクティビティにアクセスする必要があります。また、サードパーティのアクティビティは、その時点で保存されていない情報を保存する必要があります。別のタスクで実行されていない限り、アプリスイッチャーを使用して終了ボタンのアクティビティに戻ることはできないと思います。そして、それが別個のタスクである場合、それは別個のプロセスであるため、終了ボタンによって強制終了されることはありません。
Neil Traft、2013

2
1. 99.99%のAndroidユーザーは、OSがカーテンの後ろでアプリケーションを管理する方法について心配するべきではないと思います。残りはオタクであり、高度なツールがシステムを彼らが望むように正確に振る舞わせることがわかるでしょう。2.アクティビティが一時停止または停止したときに、機密データをいつでもアンロードできます。3.上記と同様に、リソースはライフサイクルコールバックメソッドで解放できます。アクティビティが再開すると、リソースを再度割り当てることができます。
ZsoltTörök2010

4
あまりにも多くのAndroidユーザーが「Advanced Task Killer」をインストールしているのは興味深いと思います。これは、通常は自分で実行できないため、他のアプリを終了するアプリです。私はいつも自分で使っています。アプリを終了することは、あなたがなしでできることではないと私は感じています。
Ted

2
@ZsoltTörök、99.99%の人が遅いコンピューター/電話を扱っており、OSがカーテンの後ろでアプリケーションを管理する方法について心配することを余儀なくされています。
Pacerier 2014年

10

LinuxカーネルにはOut-of-memory killerと呼ばれる機能があります(前述のように、ポリシーはユーザー空間レベルで構成可能であり、カーネルは最適なものではありませんが、決して不必要ではありません)。

そしてそれはAndroidで頻繁に使用されています:

これらのkillアプリを支援するために、いくつかのユーザースペースアプリを利用できます。次に例を示します。


9

あなたはどうやらfinish()コマンドであなたが望む答えを見つけました。これによってアプリがメモリから削除されることはありませんが、Androidはリソースが必要になるたびに削除するため、明示的に実行しないことには何の違いもありません。

アプリケーション出口が通常持つ完全な効果を達成するために、デバイスの起動後、最初に実行されたときの直前の通常の状態にアプリの状態をリセットすることを追加します。すべてのアクティビティでfinish()を呼び出す。このようにして、ユーザーがアプリを再度選択すると、シミュレートされた「exit」の前の時点から残っている状態なしに、「fresh」で実行されたように見えます。

ユーザーの作業の保存など、「出口」でのみ発生する特別なアクションがある場合は、上記のルーチンの再初期化部分の前にそれらを実行することもできます。

このアプローチにより、アプリの終了を含むOSリソースの管理をオペレーティングシステムの手に委ねるというAndroidの哲学に違反することなく、「exit」コマンドの目標を達成できます。

個人的には、私はこのアプローチを使用しません。Androidユーザーは、アプリに再度アクセスしたときにアプリの継続性が維持されることを期待しているため、アプリを「終了」する方法に慣れていないためです。代わりに、ユーザーがアプリをデフォルトの初期状態にリセットするために呼び出すことができる「クリア」機能をサポートします。その際、アプリを「残す」必要はありません。

1つの例外は、ユーザーが戻るボタンをアプリを閉じるのに十分な回数押した場合です。そのような状況では、ユーザーの側で状態が保存されることは想定されていません(アプリに保存されていない状態がある場合、開発者は、その保存されていないデータを検出する戻るボタンを処理するコードを持っている必要があります。 SharedPreferences、ファイル、またはその他の不揮発性メディアに保存するようにユーザーに要求します)。

system.exit(0)について:

system.exit(0)を使用して失礼なファイナリティでアプリを閉じることにした場合(たとえば、最後の[戻る]ボタンを押した結果として)、警告が表示されます。ケースは、アプリの痕跡を残さずにアプリを閉じることができた唯一の方法でした。このアプローチを使用すると、Jelly Beanで1つの小さな不具合が発生します。

具体的には、最近のアプリリストを使用してアプリを開いてから、戻るボタンを使用してアプリを閉じると(system.exit(0)を介してそのクローズを実装して)、最近のアプリリストが再び表示されます。決して閉鎖されていません。あなたはそれを実行するためにそのリストでアプリのエントリをタップする場合は二度目に同じ、既に開いて、最近使ったアプリのリストから、何の応答はありません。

これの原因は、system.exit(0)を使用してアプリを閉じたために機能しなくなったアプリへの参照が[最近のアプリ]リストに保持されているためと思われます。finish()を使用してより文明的にアプリを閉じると、最近のアプリリストを更新できるようにOSに通知された可能性がありますが、system.exit(0)は明らかにこれを行いません。

最近のアプリからアプリを開いて終了し、同じ開いている最近のアプリリストからすぐに再び開く人はほとんどいないため、これ自体は大きな問題ではありません。ホームボタンをタップしてから、最近使ったアプリリストを再度開くと、アプリのエントリが表示され、完全に機能します。 しかし、system.exit(0)を使用すると、アプリとOSの間の適切な通信が妨げられる可能性があることを示していると思います。これは、このアプローチを使用した結果、他のより深刻で微妙な可能性があることを示唆しています。


おそらく finish()を呼び出す前に最近のアプリのエントリを削除できますか?これは時間が許せば試してみたいものです。小さなランチャーアクティビティを持つフォアグラウンドサービスがあります。アクティビティは非常に小さいので、殺されずに埋められなくても大したことはありませんが、可能であれば、残りの前にこれを実行できることをAndroidに通知することは理にかなっています。
nsandersen

9

時間の経過とともに物事が変化することを願っています。アプリプロセスがOSによって正しくサンドボックス化されている場合、ユーザーはアプリまたはプロセスを強制終了できる必要があります。アプリは完全に記述する必要がある、またはユーザーがすべてのSDK推奨事項に従うアプリのみを使用するという考えがあります。それは難しい注文だと思います。


知っている。アップル製品は一部の消費者に適しています。それらは開発者にとっては良くありません。Android OSは、携帯電話の「PCの世界のWindows OS」のようになる可能性を十分に秘めています。さらに良いかもしれません。タスクマネージャーを作成できないことを除いて、PCの世界のウィンドウよりも既にオープンです。
dipu

7

(比較的)シンプルなデザインで、「出口」の難問を回避できます。アプリに「基本」状態(アクティビティ)を持たせます。これは単なる空白の画面です。アクティビティの最初のonCreateで、アプリの主な機能が含まれている別のアクティビティを起動できます。「exit」は、この2番目のアクティビティをfinish()実行し、空白の画面のベースに戻ることで実行できます。OSは、この空白の画面を必要な間メモリに保持できます...

本質的に、OSに出られないので、あなたは単に自分で作成した無に変身します。


2
良いアイデア。ただし、アクティビティ(またはサービス)を終了してもOSは停止しません。ああ、いいえ、onDestroyが実行された後でも、すべての変数とその他のものはまだそこにあります。サービスで、onDestroyが呼び出されても、すべてが同じであることを確認しました...
Ted

2
...したがってSystem.exit(0)が役立ちました=)
Ted

7

アプリケーション開発者が自分のアプリケーションを強制終了するための終了関数がないと、設計が非常に悪くなります。

私のアプリケーションでは、ユーザーが実行時に動的にデータを動的に変更できるようにする必要があり、ユーザーは変更を有効にするためにアプリケーションを再起動する必要がありますが、Androidではアプリケーション自体を再起動できませんでした。Android OSの設計アプリケーションのライフサイクルは非常に悪いです。


9
public void appRestart(){Intent i = new Intent(getBaseContext()、MyActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); }
androidworkz

2
この上のコメントのコードは本当にうまくいきます。少なくとも、アプリを完全に終了する代わりに、最初のアクティビティに移動できます。:)
Harpreet

7

いつでもアプリを閉じるにはFLAG_ACTIVITY_CLEAR_TOP、Intentのフラグを使用してから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のライフサイクルを壊すことなく機能します。


7

まず、System.exit(0)を決して使用しないでください。それは、人を眠らせ、頭を殴るようなものです。

第二に、私はこの問題に直面しています。私のソリューションを共有する前に、私の考えを共有したいと思います。

「終了ボタン」ってばかだと思います。本当に本当に本当に愚かです。また、アプリケーションの終了ボタンを要求するユーザー(消費者)も愚かだと思います。彼らは、OSがどのように機能し、どのようにリソースを管理しているのかを理解していません(それは素晴らしい仕事をしています)。

適切なタイミングで適切な処理(更新、保存、プッシュ)を行う適切なコードを記述し、適切な処理(サービスとレシーバー)を使用すると、かなりうまく機能し、誰も文句を言わないでしょう。 。

しかし、それを行うには、Androidでの動作を研究して学ぶ必要があります。とにかく、これはユーザーに「終了ボタン」を提供するための私の解決策です。

各アクティビティで常に表示されるオプションメニューを作成しました(それを行うスーパーアクティビティがあります)。

ユーザーがそのボタンをクリックすると、次のようになります。

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

アプリを強制終了するためにSharedPreferencesに保存し、インテントを開始します。それらのフラグを見てください。これらは、私の「ホーム」アクティビティであるDashBoardアクティビティを呼び出すすべてのバックスタックをクリアします。

したがって、私のダッシュボードアクティビティでは、onResumeでこのメソッドを実行します。

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

そして、それはかなりうまくいきます。

それがなぜ起こっているのか私が理解していない唯一のことは、最後の仕上げを行ったとき(そしてチェックしたところ:onPause→onStop→onDestroyのすべての正しいフローに従っている)、アプリケーションはまだ最近のアクティビティにあります(しかし空白です)。

(DashboardActivityを開始した)最新のインテントがまだシステムにあるようです。

それも削除するためにもっと掘る必要があります。


8
多くの消費者はOSが何であるかは言うまでもなく、それがどのように機能するかを知っていません。[終了] / [終了] / [オフ]ボタンが必要な場合、それらは正常です。部屋を出るときは、ライトを消します。さらに重要なのは、家を出るときはドアをロックすることです。これが、プログラムを適切に終了できない問題の原因です。プログラムをバックグラウンドで存続させることは、大きなセキュリティリスクです。
Squiggles

4
「「終了ボタン」はバカだと思います」ほとんどのソフトウェアアプリケーションには、終了ボタンがあります。
IgorGanapolsky

「// HERE STOP ALL YOUR SERVICES」と言って、finish()を使用しました。Androidサービスには、finish()メソッドがありません。それらにはunbindService(mConnection);があります。
IgorGanapolsky

@Squiggles退室時にすべての照明を自動的にオフにし、ドアをロックする部屋がある場合は、そのことを気にする必要はありません。
Seshu Vinay 2015年

7

Androidアプリケーションのライフサイクルは、コンピューターユーザーではなく、携帯電話ユーザー向けに設計されています。

アプリのライフサイクルは、Linuxサーバーをコンシューマーアプライアンスに変えるために必要な、非常に単純化したパラダイムです。

AndroidはLinux上のJavaであり、実際のクロスプラットフォームサーバーOSです。それはそれがとても速く広まった方法です。アプリのライフサイクルは、OSの根本的な現実をカプセル化します。

モバイルユーザーにとって、アプリは単にインストールされるか、インストールされません。実行または終了の概念はありません。実際、アプリプロセスは、OSが保持しているリソースに対してそれらを解放するまで実行されることを意図しています。

これはスタックオーバーフローであるため、これを読む人はすべてコンピューターユーザーであり、モバイルアプリのライフサイクルを理解するには、知識の90%をオフにする必要があります。


「コンピュータユーザーは知識の90%をオフにする必要がある」というあなたの飛躍には従いません。はい、それはRomain Guyが言うことですが、それは本当ではありません。「コンピュータユーザーの詳細オプション」セクションに「終了」ボタンが付いているので、誰のニーズにも対応できるようです。
ドンハッチ

私はこの「ロマンガイ」が誰であるか、なぜ彼が私を引用しているのか分かりません。最近のタスクを閉じると、アプリ情報から停止するのと同様に、アプリが終了します。ADBでは、上級ユーザーがシェルにアクセスできます。
Dominic Cerisano 2018年

6

このQ&Aを読むのに、実際に半適切なAndroidアプリケーションライフサイクルを実装するよりも時間がかかりました。

これは、ポイントをポーリングし、スレッドを使用して数秒ごとに現在位置を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つです。

バックグラウンドでCPUを消費しないアプリケーションであるVoilàは、RAM内にあるため(AndroidライフサイクルのようにRAMを保持していませんが)、すぐに再開する準備ができています...アプリは常に準備ができており、電話です、みんな/ギャル。アプリがすべてのRAMを使い果たし、OSによってシャットダウンできない場合、リンギングが停止する可能性があります= Pこれが、バックグラウンドにあるときにOSがアプリを閉じる必要がある理由です(アプリケーションが閉じ込められないリソースを消費するわけではないので)、より良いアプリケーションを作成してみましょう。


onPauseメソッドからsuper.onStopを呼び出すべきではありません。これは、物事を大幅に混乱させるようです。
Matt Wolfe

1
質問をかわすだけの20ほどの哲学的な答えを読んだ後...何らかのコードを持っていることの+1。
Pacerier 2014年

6

インテントを介して次のページに移動するたびに、以下を使用します。

`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();

この存在は私にとって魅力のように働きました:)


1
アプリを終了するのではなく、Mainactivityになります。
Sharath、2015

1
ただし、注意してください。killProcessおよびSystem.exitの場合、onPause()は呼び出されません。いくつか問題がありました。
Pavel Biryukov、2015年

4

いずれにせよ、アプリケーションを終了したい場合は、いつでもを呼び出すことができますSystem.exit(0);


5
System.exit()スタックに複数のアクティビティがある場合、アプリは強制終了されません。これを使用するAndroid開発者は、Androidアプリの基本的なライフサイクルを理解していません。この答えを読んでください。
Dheeraj Vepakomma 2012


2
実際、System.exit()アプリを強制終了ます。ただし、メインアクティビティ以外の場所からSystem.exit()が呼び出された場合、Androidはスタック上の1つ少ないアクティビティでアプリを再起動します。私には、それはクリーンで意図的なSystem.exitに対するばかげた応答のように思えます。つまり、div0や意図しないクラッシュの場合は、再起動するのが丁寧になるでしょう。しかし、それらは私が思い出すように自動再起動を引き起こしさえしません。しかし、いずれにしても、アプリ殺されます。再起動される可能性がありますが、強制終了されなかったわけではありません。
ジェシーゴードン

3

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);
            }
        });
    }
}

1
これにより、ユーザーがボタンを2回タブでクリックしたときにアプリがクラッシュする可能性があります。特に、何らかの理由でシステムに高い負荷がかかっている場合はそうです。これは、アレイからアクティビティを削除することで防ぐことができます。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.