2

私の状況があります。彼らが何をしているかに関係なく、私は同じ活動を次々と行っています。アルファベットの最初から名前を付けましょう。ユーザーが私のアプリケーションを使用するとき、彼はアクティビティを通過し、それらの間に独自のパスを作成するため、戻るボタンでそれぞれの順序で戻ることができます。

彼は行為から始めます。A - D - F で、戻るボタンで F から D と A に戻ります。現在、Android システムがアプリケーションが使用されていないか、特定の時間に大量の RAM が必要であると判断すると、システムはそのアプリケーションを強制終了します。私の目標は、開いたアクティビティの順序を含め、アプリケーションを以前の状態に復元する方法を見つけることです。

わかりにくいかもしれないので、以下に例を示します。

ユーザーはアクティビティ A (ログイン) - D - F - G を開いて最小化し、しばらくするとアプリが強制終了されます。彼がこのアプリケーションを再び開始するとき、彼はアクティビティ A でログインする必要があり、アクティビティ G (= 彼は前回そこにいた) を見る必要がありません。また、戻るボタンを押すと、アクティビティ F、次にアクティビティ D を実行します。 on... 一連のアクティビティを復活させるようなものです。アクティビティ (D、F、G) に保存されているすべての情報を永続化する必要があることはわかっていますが、そのようなアプリの状態を永続化することは実際に可能ですか?

これについてのコメントをありがとう

解決:

アプリケーションの状態を識別するフラグを追跡しています。フラグが 0 の場合は、新しいアクティビティを正常に開いていることを意味します。各アクティビティの開始時に、すべてのアクティビティ履歴を含む共有設定文字列に入れました。各アクティビティには独自の ID があります (これも sharedPref)。別の共有設定では、onPause が発生したときに、文字列フォーミュラー データ (または GUI を使用したデータ) として保存しています。flag を 1 に設定します。アプリが起動し、flag が 1 のときに、sharedPref からアプリケーション スタックを復活させます。それぞれに別の共有設定からデータを設定します。以上で、アプリケーションの状態が復活します:-)

4

2 に答える 2

1

必要なものは何でも永続化できます。それは、どのように、何が有益になるかの問題です。何年にもわたって状態を維持するために使用されてきた複数の手法があります。それらのほとんどすべてを利用できますが、慎重に管理する必要があります。アプリケーションの機能によっては、特別なトリックを利用できる場合もあります。

ステップ1

効果的に実行するために各アクティビティに必要なものを決定します。再計算できるものと再計算してはいけないものを決定します。たとえば、アクティビティの 1 つが何らかの種類のカーソル アダプターであり、テーブルのキーに従って動作する場合、アクティビティ全体を永続化する必要はありません_id。その特定のアクティビティの実行に関連するものを保持するだけで済みます。

ステップ2

アクティビティ履歴を追跡したいので、その履歴を表現する必要があります。あなたが提案しているのはスタック モデルであるため、独自のスタック オブジェクトを記述し、そのスタック内の各アクティビティを識別する簡単な方法を見つける必要があります。常にリークにつながるため、実際のアクティビティ参照を保存しようとしないでください。次に、このスタックをデータベース、共有設定、ファイルに保存したり、バンドルに分割したりすることができます。各アクティビティを識別する整数定数は、これを実現する 1 つの方法かもしれません。

ステップ 3

保存方法を決定し、スタックと各アクティビティに適した保存方法と読み込み方法を構築します。

ステップ 4

[戻る] ボタンをオーバーライドして、スタック上の最上位のアクティビティ識別子とその適切なデータを取得します。(注:スタックは拡張された方が良いかもしれませんApplication)次にActivity、必要なデータで次を開始します。

ステップ 5

「ログイン」アクティビティ (またはアプリケーション) が開始したら、スタックをロードします。認証が完了したら、スタックの一番上のアクティビティをリロードし、必要なデータをインテント エクストラを介して渡します。すべてのアクティビティを一度に開く必要はありません。ユーザーがオンになっているアクティビティだけを開きます。

ステップ 6onCreateまたはonWindowAttachedfor eachで 、Activityそれ自体をスタックに追加します。onDestroyfor eachで、Activityスタックからそれ自体を削除します。データを保持しているため、 が完了したことを簡単finish()に示すことができますActivity

ステップ 7

あなたonPauseのfor eachでは、Activityあなたが重要だと感じる状態を保存してください。スクロール位置を保存して、再起動時にActivity再スクロールすることもできます。あなたonCreateが提供したエクストラを介して、あなたの持っている状態を取り戻します。

それはすべてそれと同じくらい簡単です。サンプルが必要な場合は、喜んで提供します。

ファジカルロジック

于 2011-10-22T18:51:56.963 に答える
1

A から Z まで (または何でも) のアクティビティのパスを再構築するだけでよいと仮定すると、物事を複雑にしすぎる必要はありません。正しい方法で実行したい場合は、Fuzzical Logic の提案に従ってください。すぐに実行して後で複雑にしたい場合は、この簡単な方法から始めることができます。

基本的に、各アクティビティをコードにマップし、単純なテキスト ファイルを維持します。アクティビティが呼び出されるたびに、そのコードをテキスト ファイルに追加する必要があります。つまり、質問で説明したことを正確にファイルに書き込んでいるだけです。あなたの例では、テキスト ファイルに「ADFG」があります。

アクティビティを終了して戻るときは、ファイルを読み、最後の文字を切り取り、書き出すだけです。あなたの例では、「ADFG」を押し戻した場合、ファイルには「ADF」が含まれます。

アプリが起動したら、ファイルを読み込んで、通常どおり各キャラクターに関連付けられたアクティビティを作成します。ファイルを 1 回読み取り、作成時に各アクティビティに文字列を渡します。そのため、ルート アクティビティは「A」を読み取ってそのアクティビティを開始し (バンドルで文字列「DFG」を渡します)、そのアクティビティは次の文字を読み取って D アクティビティを開始し (「FG」を渡します)、というように、最後のアクティビティでは、文字列に文字が残っていないことがわかります。

すべてが機能したら、各アクティビティの状態情報を保存する方法について考えることができます。Fuzzy のソリューションは最もエレガントですが、通常はエレガントと ASAP が混在することはないので、それはあなた次第です。スタック内の各アイテムの状態データからスタック データを分離します。IMOの方が簡単です。

それが役立つことを願っています!

于 2011-10-26T14:41:50.970 に答える