所以,我一直在研究这个问题一段时间,我觉得我越来越接近理解这个问题,但不是解决方案。这里是...
我有一个 Activity(A 类),它通过 startActivityForResult() 调用另一个 Activity(B 类)。B 类是我的 OAuth 处理程序,它在启动 AsyncTask 之前准备 URL 请求以通过 Internet 向提供者进行身份验证。它通过使用该 URL 调用一个意图来完成此操作,该 URL 会启动浏览器并将我带到用户登录页面。我登录并授权该应用程序,然后将我带回到我认为的 B 类。但是,这就是问题所在。
返回应用程序后,Android 似乎创建了我的 B 类活动的另一个实例并执行了 onResume() 方法,而不是上面创建 AsyncTask 的方法。这是一个问题,因为当我调用完成时,它所做的只是杀死 B 类的那个实例,然后回到 B 类的第一个实例。这是一个问题,因为我需要传递 B 类的结果回到A班,所以我知道手术成功了。如果我随后完成() B 类的第一个实例,它会将 RESULT_FAILED 代码传回 A 类...
我错过了一些非常明显的东西吗?如果你想看一些代码,请告诉我。
更新:我添加了一些代码以使其更清晰:
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() 时,它必须被调用两次。我在模拟器中执行此操作,有时我可以看到活动变化的动画。
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();
调用完成,但是我需要调用它两次。我通过禁用对上述代码的自动调用来测试这一点,并在活动中放置一个按钮来执行它。正如所料,我不得不按两次按钮。