2011-12-16 15 views
2

私がここで言うことは、私が前に残したのと同じ状態から私のアプリを再起動することに直面している問題です。R & D活動を開始しながら、これとstackoverflow.Soに投稿された質問を経ていて、それが重複していることを言う必要はありませんしてください。同じ状態からアプリを再起動できませんでした。(

に私は、これらのオプションに
objIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
を入れてみました。また、私はこれを試してみました、

objIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 

そして最後に、私はまた

objIntent.setAction(Intent.ACTION_MAIN); 
    objIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

この方法を試してみました。しかし、これらのどれも私のために働いているように見えるん。

このシナリオは、これが失敗した場合のようになります。

  1. 私は最初の活動から、いくつかの活動に行き、自分のアプリケーションを実行

  2. をAからBに言って今、私は自分の携帯電話のホームボタンを押して、写真をクリックするようないくつかの操作を行いますし、など

  3. もう一度ホーム画面からアプリを起動しようとします。

おっと!今では私のアプリは状態を保持していない、それは初期状態から起動しています。

注:

  1. しかし、これはすべての場合には当てはまりません。 10倍から15倍のうち約1倍または2倍と言われることもありますが、前回と同じ状態から起動します。

  2. もう1つ質問がありますが、これをすべてのインテントに設定する必要がありますか?インテントの10以上のポジション、つまりアクティビティを開始しているとします。これらすべての場所にこのコードを追加する必要がありますか?私は2または3例

    のためにこれを含め

更新:

これは、デバッグモードで動作しますが、それはAPK作成のポイントに来るとき、それは失敗しつつあります。しかし、私が何度も試してみると、それは私に必要な結果をもたらし、その後は予想どおりに行動します。なぜこのように起こったのか理解するために頭を壊した。

いずれかの回答がありますか?

答えて

0

はい、できます。 Googleフォーラムのおかげです。私はこれをhttps://github.com/cleverua/android_startup_activityと呼んだ。

私がこれに基づいて行ったことは、スタートアップアクティビティを作成することです。内部でメソッドを作成していて、needStartApp()などのカスタムメソッドを確認してください。これで、実行中のタスク情報を取得し、アプリケーションパッケージ名と比較します。それが真実なら、最初の活動を開始してください。残り物はすべてうまくいく。ここで

はあなたが追加する必要があり、余分な活動が終わり、

public class StartupActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (needStartApp()) { 
     Intent i = new Intent(StartupActivity.this, MainActivity.class); 
     startActivity(i); 
    } 

    finish(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // this prevents StartupActivity recreation on Configuration changes 
    // (device orientation changes or hardware keyboard open/close). 
    // just do nothing on these changes: 
    super.onConfigurationChanged(null); 
} 

private boolean needStartApp() { 
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    final List<RunningTaskInfo> tasksInfo = am.getRunningTasks(1024); 

    if (!tasksInfo.isEmpty()) { 
     final String ourAppPackageName = getPackageName(); 
     RunningTaskInfo taskInfo; 
     final int size = tasksInfo.size(); 
     for (int i = 0; i < size; i++) { 
      taskInfo = tasksInfo.get(i); 
      if (ourAppPackageName.equals(taskInfo.baseActivity.getPackageName())) { 
       // continue application start only if there is the only Activity in the task 
       // (BTW in this case this is the StartupActivity) 
       return taskInfo.numActivities == 1; 
      } 
     } 
    } 

    return true; 
    } 
} 

で、マニフェスト

<uses-permission android:name="android.permission.GET_TASKS" /> 

にこの権限を追加することを忘れないでください「のAndroid OSはしかし、本当に良いですそれは完璧ではない」

2

アクティビティをバックグラウンドで実行し続けることは、あなたの手にはありません。ホームボタンを押すと、起動した他のアプリケーションのメモリの必要性に応じて、現在のアクティビティがバックグラウンドに移り、いつでも殺すことができます(onDestroy()が呼び出されます)。

あなたが起動するアプリが多くなればなるほど、あなたのバックグラウンドアプリを殺す機会は増えます。

+0

いいえ、これはシナリオではありません。私はこれをチェックした。 – tejas

0

ユーザーが残したのと同じ状態でアプリを「再起動する」場合は、onSaveInstanceState(Bundle)メソッドにすべてのアプリ状態を保存し、onRestoreInstanceState (Bundle savedInstanceState)メソッドで復元する必要があります。前回の回答で述べたSaurabhのように、あなたのアプリがいつ殺されるかを制御することはできません。

Stateの「保存」には、SharedPreferencesとSQLite DBの2つの方法があります。

+0

これを試してみます。しかし、私はすべての活動のためにこれを行う必要がありますか?私は15以上の活動とそれにたくさんのデータが保存されている私の場合、これは面倒な作業であると私は信じています。本当? – tejas

+0

私が言及した方法はアクティビティごとに実装する必要があります。ただし、「アプリケーション全体」のデータを保存する場合は、 'Application'クラスまたは静的なシングルトンを使用できます。後者のアプローチはhttp://developer.android.com/resources/faq/framework.html#3で説明されています。これは、単一のアプリケーションのコンポーネント間で*日付を渡すことについて話します。あなたができることは、1つ(または少数)の「主な」活動を決定することです。これらのアクティビティでインスタンスの状態を保存/復元することができます。静的なシングルトンを使用して状態にアクセスします。 – curioustechizen

関連する問題