0

「onActivityResult」関数内から新しいインテントを呼び出そうとしていますが、結果が期待したものではありません。無限にループするか、早期に終了します。

「メイン」アクティビティ内でバンドルの配列を作成し、次にバンドルごとにインテントを作成し、現在のアクティビティが「完了」を返すのを待ってから、次のバンドルで新しいアクティビティを開始します。

問題は、onActivityResultを呼び出すたびに「メイン」アクティビティが再開することです。つまり、onStartが再度呼び出され、すべてのバンドルが無限のループで再作成されます。これを回避する唯一の方法は、「finish();」を追加することです。onActivityResult関数の最後までですが、これにより、onActivityResultを1回呼び出しただけで、プロセス全体が停止します。

コードは次のとおりです(簡略化):

public class mainActivity extends Activity {

   ArrayList<Bundle> bundles;
   int taskId = 0;
   // A few other things here; nothing important to this question.

    public void onCreate(savedInstanceState)) {
        super.onCreate(savedInstanceState);
        bundles = new ArrayList<Bundle>();
    }

    public void onStart() {
        // Here I perform a loop that creates a number of bundles
        // and adds them to the "bundles" array (not shown).

        // Start the first activity:
        Intent firstIntent = new Intent(this, StuffDoer.class);
        firstIntent.putExtras(bundles.get(0));
        startActivityForResult(firstIntent, taskId);
        bundles.remove(0);
    }

    public void onActivityResult(int requestCode, int result, Intent data) {
        super.onActivityResult(requestCode, result, data);
        if (result == RESULT_OK) {
            if (bundles.size() > 0) {
                taskId += 1;
                Intent intent = new Intent(this, StuffDoer.class);
                intent.putExtras(bundles.get(0));
                startActivityForResult(intent, taskId);
                bundles.remove(0);
            } else {
                Log.v(TAG, "No more to do, finishing");
                finish();
            }
        } else {
            Log.v(TAG, "Did not get the expected return code");
        }
        // finish(); // If I uncomment this, it only performs this function 
                     // once before quitting. Commented out, it loops forever 
                     // (runs the onStart, adds more bundles, etc.).
    }
}

これを行う正しい方法は何ですか?

4

1 に答える 1

0

何をしようとしているのかはわかりませんが、アクティビティを最初に開始したときにバンドルを作成するだけでよい場合は、onCreate()で作成してください。通常、アクティビティに実装するコールバックは、onCreate、onPause、およびonResumeです。アクティビティの通常の生活では、onResumeとonPauseの間のライフサイクルループにあります。

しかし、私は興味があります。なぜ毎回メインアクティビティに戻る必要があるのですか?あなたの主な活動が他の活動を「制御」しているように聞こえます。通常、Androidアプリのより良いモデルは、各アクティビティを個別に機能させ、必要に応じて別のアクティビティに切り替えることです。これは基本的に、ユーザーがランチャーのアプリアイコンをクリックしたときに開始される「最初の対等」アクティビティを除いて、「メイン」のない「プログラム」です。

于 2013-03-26T20:14:30.143 に答える