2

ここで言いたいのは、アプリを以前と同じ状態から再起動するために直面​​している問題です。私はこれについて多くの研究開発を行い、stackoverflow に投稿された質問を調べました。重複していると言う必要はありません。


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. アプリケーションを実行し、A から B への最初のアクティビティからいくつかのアクティビティに移動します

  2. 次に、電話のホームボタンを押して、写真をクリックするなどのアクションを実行します。

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

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

ノート:

  1. ただし、これはすべての場合に当てはまるわけではありません。場合によっては、10 回または 15 回のうち 1 回または 2 回程度、元の状態から起動します。

  2. 私が持っているもう1つの疑問は、すべての意図に対してこれを設定する必要があるかということです? アクティビティを開始する、つまり意図の位置が 10 以上あるとします。これらすべての場所にこのコードを追加する必要がありますか? 私はこれを2つか3つの場合に含めました

アップデート:

これはデバッグ モードで機能しますが、apk 作成の段階になると失敗します。ただし、何度も試すと、必要な結果が得られ、その後は期待どおりに動作します。なぜこのようなことが起こったのかを理解するために頭を悩ませています。

誰もこれに対する答えを持っていますか?

4

3 に答える 3

2

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

起動するアプリが多いほど、バックグラウンド アプリを強制終了する可能性が高くなります。

于 2011-12-16T11:02:56.610 に答える
0

はい、ついに可能になりました!! グーグルフォーラムに感謝します。このhttps://github.com/cleverua/android_startup_activityを参照しました。

これに従って私がしたことは、スタートアップアクティビティを作成することです。その oncreate メソッド内で、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 は本当に優れていますが、完璧ではありません。」

于 2011-12-20T04:33:26.867 に答える