問題タブ [activity-lifecycle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - AppState をファイルから読み込み中に ProgressDialog を表示する
アクティビティが閉じられると、アプリケーションの状態データをファイルにシリアル化して、アプリがシステムによって強制終了された場合に状態を再読み込みできるようにします。
このアプローチ (状態の保存と復元) は正常に機能します。ただし、プロセスが強制終了された場合、ロードするデータの量によっては、ロード状態のプロセスが完了するまでに少なくとも数秒かかることがあります。
そのため、データが onLoad にない場合、アクティビティがクラッシュするため、分離されたスレッドに状態をロードすることはできません。
そこで、コンテンツの読み込み中に進行状況ダイアログを表示したいのですが、Activity の onLoad メソッドが呼び出されるのは読み込み状態のプロセスの後であることを確認してください。
どうすればこれを達成できるか知っている人はいますか? どうもありがとう。
android - デバイスの向き、Android での突発的な分析
アクティビティのライフ サイクル中に発生するセッション ログが原因で、アプリケーションのデバイスの向きが分析をゆがめているかどうかに関する情報を見つけようとしています。
Flurry のセッションは、アクティビティの開始と停止で開始および終了するように見えます。また、デバイスの向きにより、新しいアクティビティ ライフ サイクルが効果的に開始されます。このために 2 セットのデータを受け取ることになりますか?
もしそうなら、ユーザーがデバイスを回転させたときに歪んだ結果を受け取らないように、デバイスの向きを処理する正しい方法は何ですか?
android - killProcess でアプリケーションが時々再起動するのはなぜですか?
通常、次のように呼び出してアプリケーションを終了します。
何事もなくうまくいく。
しかし、時々、アプリケーションは (終了後に) 再起動します。
関連するログ スニペットは次を示しています。
Android OS の設計上、killProcess()がアプリケーションを終了する適切な方法ではないことはわかっています。これは、killProcess()が、アプリがプロセスを防止したり準備したりする方法や機会を与えずに、プロセスをすぐに停止するためです。
finish()を呼び出すと、アプリケーション スタックがバックグラウンドにプッシュされる (そしてメモリ内にまだ存在する) ことがわかっています。Android 自体がいつアプリケーションを閉じるか (つまり、メモリからインスタンスを削除するか) を決定します。一般に、これは、アプリケーションが「最も長く使用されていない最も古いもの」になったときに行われます。それが本当に最後のものである場合、その動作は実際にはより予測可能です。
問題は、finish()が呼び出されたアクティビティのみを停止して破棄することです。アプリケーションまたは他のアクティビティによって生成された他のアクティビティは停止しません。そのため、開発中のテストとデバッグを容易にするために 、便利なショートカットとしてkillProcess()を使用しています。
しかし今では、アプリケーションが自分自身を強制終了した直後に再起動するという副作用があることがわかりました。すべて30 ミリ秒以内です。
簡単な解決策は、すべてのアプリケーションのアクティビティを繰り返し処理し、finish()することです。しかし、これに進む前に、Android OS の何がアプリケーションを復活させるのかを理解したいと思っています。
Android が強制終了されたアプリケーションを再起動するのはなぜですか?
そして、なぜ一貫性がないのですか?(つまり時々 )
android - オーバーライドされた getApplication() から共有静的を返すのは安全ですか?
同じアクティビティ (全員が共有するライブラリ プロジェクト内) を使用して、一度に1 つのアプリケーションしか実行できないように、アプリケーションのファミリを制限しようとしています。
その方法を学ぼうとした最初のラウンドで、私は次のことを学びました。
- android:launchMode="singleTask" はうまくいきません。
setVisible(true/false)
それぞれ onResume()/onPause() で、アプリケーションが実行されているかどうかを確認する最良の方法です。しかし、2 番目のインスタンスが 1 番目のインスタンスが実行中であることを認識したら、どうすればよいでしょうか?
そのため、 Activity.getApplication()をオーバーライドして共有静的を返すことで、常に同じインスタンスを返すことで、システムをだますことを考えています。
(アイデアの功績は@inazarukにあります)
しかし、前述の可視化ソリューションと同様に、これをどうすればよいでしょうか?
システム自体がgetApplication()を使用して、新しいインスタンスを起動するか、単にスタックの先頭に置くかを決定しますか? これは安全ですか?
答えが「いいえ」の場合、Activity.finish()を呼び出して、2 番目のアクティビティが開始されないようにすることはできますか? もしそうなら、どこでこれをしますか?
- Activity.onCreate ()にありますか?
- Activity.onResume() ?
- MyApplication() ? (コンストラクタ)
- より良い場所?
android - getRunningAppProcesses() は破棄されたプロセスを返します
次のスニペットを使用して、finish()
編集したアプリケーションが実際に実行されなくなったかどうかを確認しています。
残念なことに、私がfinish()
(Activity.onCreate() で、何かを起動する前に) 編集したいくつかのアプリケーションがまだそこにリストされています。
なんで?
LogCat は、これらのアプリケーションonDestroy()
が確実に呼び出されたことを示しています。
そのリストからアプリケーションを完全に削除するには何が必要ですか?
頼れるのはkillProcess()
私だけですか?
android - 「永続的な状態」と「現在の状態」
(私のアプリケーションのために)何をonPause()に保存し、何をonSaveInstanceState() に保存するかを決定しようとして、ヒントと明確なガイドラインのために SO 全体を調べました。
私が正しく理解していれば、onSaveInstanceState()は「実行時の変更」または「現在の状態」(それが何を意味するにせよ) を保存するのに最適であり、onPause()は「永続的な状態」(それが何を意味するにせよ) を保存するのに最適です。
アプリケーションで「永続的な状態」と「現在の状態」を構成するものを判断するのにまだ苦労しています。たとえば、ユーザー設定は明らかに永続的ですがonPause()
、ユーザーが変更したときに Android UI フレームワークによって常に自動的に保存される場合、それらを保存する必要がありますか?
クラス データ メンバーはonSaveInstanceState()に保存する必要がありますか? アプリケーションのすべてのクラスでこれを行う必要がありますか?
私は混乱しています。
onPause()
に保存する必要があるものと に保存する必要があるものの実例を挙げていただけますonSaveInstanceState()
か? つまり、デバイス構成の変更を除きます。
--
私の質問に答えた後、いくつかの新しい洞察:
- onSaveInstanceState
Bundle
は何にも書き込まれず、永続的ではありません。 - onSaveInstanceState の
Bundle
データは、アプリケーションが閉じられるまでメモリに保持されます。
android - BroadcastReceivers の使用に関するいくつかの問題
BroadcastReceiver
私は自分のアプリケーションAsyncTask
で異なる結果インジケータとして使用したいと考えてActivities
いAsyncTasks
ます。私のアプローチは少し間違っているか、何かを逃したと思います。
ここで私がやっていること: まず、メソッドを使用しonCreate
てレシーバーを登録しました。私の受信機は次のようになります。BroadcastReceiver
registerReceiver
私のアプリケーションでは、A と B の活動があります。それぞれに、異なるタスクからメッセージを取得する異なるレシーバーがあります。ところで、はっきりさせておかなければならないのは、A 活動が B 活動を開始するということです。
アクティビティ A でレシーバーを使用し、次にアクティビティ A を使用して B を開始しstartActivity
ます。アクティビティ B で を実行し、B アクティビティのコンテキストでブロードキャストを送信していますAsyncTask
。onPostExecute
しかし、どういうわけかまだアクティビティの受信者がメッセージを取得しています。どちらのレシーバーも内容は同じですが、名前が異なります。
だからここに私の問題があります:
- メソッド
unregisterReceiver
で新しいアクティビティを開始したときにすべきですか?onPause
BroadcastReceiver
それが私が使用している方法ですか、1回の通話のみですか?メッセージを送信するたびに、何度も登録する必要がありますか?- にレシーバーを定義していないと確信しています
Manifest
。これは私が間違っていることだと思います。これでよければ、ブロードキャストの送信中に IntentFilter を使用するにはどうすればよいですか?
不明な質問があれば教えてください。BroadcastReceiver についての手がかりは、素晴らしく、高く評価されます。
android - Phonegap のバックグラウンド化と、アクティビティ、プロセス、およびサービスのライフサイクル間の関係
Phonegap アプリケーションがあり、バックグラウンドでいくつかの手順を実行したいと考えています。つまり、Phonegap アクティビティが表示されていない間に何らかのロジックを実行します。今のところ、これらの手順を実行するネイティブ サービスを作成することはできないため、Phonegap アクティビティ自体をサービスとして機能させたいと考えています。もちろん、Service として実行するロジックは Javascript であり、通常の Android Service として実装することはできません。私が考えた解決策の 1 つは、Phonegap アクティビティを一種の疑似サービスとして扱い、「ダミー」または空のサービス (startService
および を使用startForeground
) を生成することです。Phonegap アクティビティのライフサイクルはサービスのライフサイクルに結び付けられ、バックグラウンドで Javascript コードを実行し続けるという考え方です。
Phonegap を知っているかどうかに関係なく、私の質問は次のとおりです。プロセス内でフォアグラウンド サービスを生成して優先順位を付ける場合、これはアクティビティのライフサイクルに影響しますか? サービス (およびそのプロセス) が存続し、メインのアクティビティがメモリから消去される可能性はありますか?
アクティビティのライフサイクルが影響を受けるという保証がない場合、実際に何が起こるかについて何か言えますか?
android - このシナリオで Android アクティビティが作成される理由を理解する
これを行うquitメソッドがあります:
mRunningActivities が OK であることを確認しました。作成され、破棄されていないタスク内のすべてのアクティビティで構成されています。すべてのアクティビティは から継承します:
セット内の 2 つのアクティビティで、メカニズムが正常に機能していることに気付きました。ただし、3 つのアクティビティの場合、Android 4.0.3 は、セット内のアクティビティの 1 つの別のインスタンスを起動 (作成) する必要があると判断します (特定のアクティビティだけでなく、特定の 1 つのアクティビティを開始するのが特に好きなようです)。そして彼らはそれらをすべて終わらせます(したがって、元の3つの代わりに4つの破壊された活動)
そのアクティビティを誤って作成したのは私ではないと確信しています - すべての launchActivity ロジックは、FLAG_ACTIVITY_REORDER_TO_FRONT フラグをインテントに追加するメソッドによってフィルタリングされるため、同じ Activity クラスの 2 つのインスタンスで終わることはありません。それを新たに作成しているのはOSであるに違いありません。
また、「android:launchMode="singleTop"」マニフェスト ファイル プロパティなしで試してみました。これは、アプリ内のすべてのアクティビティでこのようなものです。同じこと。
ここで何が起こっているのですか?上記の onNewIntent() メソッドは予想どおり 3 回ヒットしますが、途中で Android が新しいアクティビティを作成し、すぐにそれも終了します。
ありがとう
android - タスク マネージャーがタスクで最後に表示されたアクティビティを再作成できないようにする
シナリオは次のとおりです。
アプリを起動し、アクティビティ A を開始し、B に移動してから C に移動し、ホーム ボタンを押します。Cは破壊されます。タスク マネージャーを起動し、アプリのアイコンを押します。アクティビティ C が再作成されています。この動作を停止するにはどうすればよいですか? 私が望むのは、アクティビティ A に戻ることです。
これに最も近いのは、アクティビティ B、C を Intent.FLAG_ACTIVITY_NO_HISTORY で起動することでした。ただし、このフラグの問題は、アクティビティ B、C がアプリの存続期間を通じて再作成されないようにすることです (タスク マネージャーがユーザーを A に導くと、アクティビティは作成可能になるはずです)。
編集:代わりにこのアプローチを使用すると、 Intent.FLAG_ACTIVITY_NO_HISTORY ケースと同じ動作が観察されます:
onDestroy() が一度呼び出されると、アクティビティ C に戻ることはできません :(
ありがとう