0

私が持っている本は、ライフサイクルの操作方法を説明するのにひどいものです。誰かが記入してくれることを願っています.

私のアプリの構造は、最初に起動したときに、ユーザーが受け入れなければならない合法的なおしゃべりでいっぱいのアクティビティを開始するというものです。彼が「OK」と言ったら、メインのアクティビティを開始し、次のように終了を呼び出します。

public void onClick(View view) { //as a result of "I accept"
    Intent mainIntent = new Intent(mParent, EtMain.class);
    startActivity(mainIntent); // Start the main program
    finish();
}

次に、onCreate メソッドの EtMain で、いくつかのタブを取得し、いくつかのクラスをインスタンス化します。

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mTabHost = (TabHost)findViewById(android.R.id.tabhost);
SetupTabs.setMyTabs(mTabHost, this);

mComData = new ComFields(this); // Create the objects
mDepWx = new WxFields(this, DepArr.Departure);
mArrWx = new WxFields(this, DepArr.Arrival);
mDepVs = new DepFields(this);
mArrVs = new ArrFields(this);
mTabHost.setOnTabChangedListener(new OnTabChangeListener(){
}

質問: 最初のフラグメントの 'finish' は、法的バブル アクティビティを終了する必要があるため、再開されることはありませんよね? EtMain は、アプリがバックグラウンドにプッシュされたとしても (外部で強制終了されるまで) 永久に残りますよね?

現在のやり方では、EtMain がプッシュされ、後で (アイコンをタップして) フォアグラウンドに移動すると、まるで完全な開始であるかのように法的バブル画面を通過します。これは私が防止したいことです。再び画面。

2 番目のコード フラグメントで onRestart をオーバーライドし、アプリを再起動するために何かを入れたいと思うでしょう。そこがよくわからない部分です。

私の質問は、onRestart で何をする必要があるかです。すべてのタブとタブ内のデータ、およびすべてのオブジェクトのインスタンス化を再作成する必要がありますか? または、アプリのメモリ状態がどこかに保存され、他の何かがフォアグラウンドに持ち込まれる前の状態に復元されます。その場合、すべてのオブジェクトとリスナーがまだ存在するため、多くのことを行う必要はありませんか?

4

3 に答える 3

2
  1. はい、最初のアクティビティが終了した後は、そのアクティビティを再度表示する必要はありません。また、ユーザーが以前に法的な情報を見たことがある共有設定に書き込むこともできます。

  2. UIオブジェクトの作成がonCreateメソッドで行われている場合、これは1回だけ呼び出す必要があります。一時停止または再開しても、onCreateメソッドは再度呼び出されません。

  3. onPauseメソッドでオブジェクトとtabChangedListenersを明示的に削除しない限り、onRestartメソッドでそれらに触れる必要はありません。

  4. 正解です。アプリの状態は自動的に保存されます。onRestartメソッドに触れる必要はありません。

お役に立てれば!

于 2011-09-25T00:06:43.780 に答える
1

問題は、マニフェストの起動アクティビティがリーガルバブルアクティビティであるため、アイコンをクリックすると、システムが別のアクティビティを起動することだと思います。より良いアーキテクチャは、を使用して、後者のonCreateメソッドのEtMainアクティビティからlegalbabbleアクティビティを起動することstartActivityForResultです。ドキュメントから:

特別な場合として、アクティビティの最初の/のstartActivityForResult()間にrequestCode> = 0で呼び出すと、開始されたアクティビティから結果が返されるまでウィンドウは表示されません。onCreate(Bundle savedInstanceState)onResume()

で結果が得られたら、法的なものが拒否されたかどうかonActivityResultを呼び出すことができます。finish()それ以外の場合は、すべてが正常に進行します。

これにより、法的なものが受け入れられたときにマニフェストで定義された起動アクティビティが終了するという問題が回避されます。

于 2011-09-25T00:11:49.040 に答える
1

ユーザーが(BACKキーを押して)バックアウトすると、EtMainは永久に残りません(onPause、onStop、onDestroyの順に呼び出されます)。一般に、複雑なことをするまではonRestoreを無視できます。

ユーザーがアプリケーションを終了して再入力すると(またはホーム画面のアイコンを押すと)、最初のアクティビティに対してonCreate(続いてonStartとonResume)が呼び出されるため、onRestartにロジックは必要ありません。 onCreateは、最初に行ったようにセットアップを行います。このため、ユーザーがアプリを終了した後にアプリを起動すると、既に表示されていることを示す設定を(SharedPreferencesまたはデータベースまたはファイルに)保存しない限り、法的なバブルが再び表示されます。その場合は、すぐに終了してメインを起動してください。アクティビティ。

onRestartは、アプリケーションが停止状態(onStopは呼び出されたが、onDestroyは呼び出されなかった)から開始状態(onStartは呼び出されたが、onResumeはまだ呼び出されていない)に移行したときにのみ呼び出されます。

データを保存するために-一部のコンポーネントは状態を自動的に保存します(たとえば、EditTextsはその中のテキストを記憶し、TabHostsは現在選択されているタブを記憶しますなど)。一部のコンポーネントはそうではありません。追加のデータを保存する場合は、onSaveInstanceStateとonRestoreInstanceStateを使用してください。これらのメソッドは、アプリケーションまたは一時データの状態を復元するためにのみ使用する必要があります。重要なものではありません。たとえば、ユーザーが見ているリソースのID、ユーザーが見ているズームレベルなどです。連絡先や実際のデータなどの場合は、 onPauseが呼び出されたときに、これらの変更をデータベース、SharedPreferences、またはその他の永続ストレージ(ファイルなど)にコミットする必要があります。

混乱している場合は、 Androidアクティビティのライフサイクルを確認することをお勧めします。または、さらに質問してください!

于 2011-09-25T00:13:51.333 に答える