0

それで、私はこの問題にしばらく取り組んできましたが、問題の理解に近づいていると感じていますが、解決策ではありません。ここにあります...

startActivityForResult() を介して別のアクティビティ (クラス B) を呼び出すアクティビティ (クラス A) があります。クラス B は私の OAuth ハンドラーであり、AsyncTask を開始してインターネット経由でプロバイダーと認証する前に、URL 要求を準備します。これは、その URL でインテントを呼び出すことによって行われます。これにより、ブラウザーが起動し、ユーザーのログイン ページに移動します。アプリにログインして承認すると、クラス B と思われる状態に戻ります。ただし、ここに問題があります。

アプリに戻ると、Android はクラス B アクティビティの別のインスタンスを作成し、上記の AsyncTask を作成したメソッドではなく、その onResume() メソッドを実行したようです。これは問題です。finish を呼び出すと、クラス B のインスタンスが強制終了され、クラス B の最初のインスタンスに戻るだけだからです。クラス B からの結果を渡す必要があるため、これは問題です。クラスAに戻ったので、作戦は成功したと思います。その後、クラス B の最初のインスタンスを finish() すると、クラス A に RESULT_FAILED コードが返されます...

本当に明らかな何かが欠けていますか?コードを見たい場合はお知らせください。

更新:これを明確にするためにいくつかのコードを追加しました:

クラスA(クラスB呼び出し時):

button2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.cancel();
Intent intent = new Intent();                
intent.setClass(myContext, ClassB.class);
startActivityForResult(intent, LIKE_ACTION);
}
}

クラス B (プロバイダーで認証するために URL を呼び出す場合、これは AsyncTask 内で呼び出されます):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl));
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
myContext.startActivity(intent);

myContext はクラス B です。この時点で、URL がブラウザーによって読み込まれ、ユーザーがログインしてアプリを承認できるようになります。アプリが承認され、クラス B が呼び出されます。さらにいくつかの作業が行われ、finish が呼び出されます。上記のように、finish() を呼び出すときは、2 回呼び出す必要があります。私はエミュレーターでこれを行っていますが、アクティビティの変化のアニメーションが表示されることがあります。

クラス B (アクティビティを閉じるために呼び出されるコード):

Intent tokenAndSecret = new Intent();
tokenAndSecret.putExtra("Token",mSettings.getString(USER_TOKEN, null));
tokenAndSecret.putExtra("Secret",mSettings.getString(USER_SECRET, null));
setResult(Activity.RESULT_OK, tokenAndSecret);
finish();

Finish が呼び出されますが、2 回呼び出す必要があります。上記のコードへの自動呼び出しを無効にしてこれをテストし、代わりにそれを実行するボタンをアクティビティに配置しました。案の定、ボタンを2回押さなければなりませんでした。

4

0 に答える 0