gpt4 book ai didi

android - 如何关闭整个任务堆栈的 Activity ?

转载 作者:行者123 更新时间:2023-11-29 02:07:22 25 4
gpt4 key购买 nike

我正在使用库 SocialLib将共享功能添加到我的应用程序。我在使用 oAuth 回调时遇到了真正的问题。

我创建了以下 Activity 来处理共享:

import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import com.expertiseandroid.lib.sociallib.connectors.SocialNetworkHelper;
import com.expertiseandroid.lib.sociallib.connectors.TwitterConnector;
import com.expertiseandroid.lib.sociallib.exceptions.NotAuthentifiedException;

public class ShareActivity extends Activity {

protected final static String TAG = "ShareActivity";
private final Activity activity = this;

public static final int SERVICE_TWITTER = 0;
public static final int SERVICE_FACEBOOK = 1;
public static final int SERVICE_LINKEDIN = 2;

// twitter API
protected static String TWITTER_KEY = "";
protected static String TWITTER_SECRET = "";
protected static String TWITTER_CALLBACK = "myapp://twitter";

protected static String stringToShare = "Hello World";

// connectors
private static TwitterConnector twitter;

/**
* @see android.app.Activity#onCreate(Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Bundle bundle = this.getIntent().getExtras();

Uri uri = this.getIntent().getData();
if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK)) {
postTweet();
}
else {
switch (bundle.getInt("service")) {

case SERVICE_TWITTER:
twitterAuth();
break;

default:
break;
}
}
}

public void twitterAuth() {
twitter = SocialNetworkHelper.createTwitterConnector(TWITTER_KEY, TWITTER_SECRET, TWITTER_CALLBACK);
}

public void postTweet() {
twitter.authorize(activity);
twitter.tweet(stringToShare);
finish();
}
}

从我要共享的 Activity (MainActivity) 调用以下命令启动 ShareActivity:

Intent intent = new Intent(getApplicationContext(), ShareActivity.class);
intent.putExtra("service", ShareActivity.SERVICE_TWITTER);
startActivity(intent);

我正在使用 Intent 过滤器,以便 Twitter (oAuth) 可以回调调用 Activity :

<activity android:name=".MainActivity" />
<activity android:name=".ShareActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="twitter" android:scheme="lifetime"/>
</intent-filter>
</activity>

流程:

  1. 使用单击 MainActivity 上的共享按钮。
  2. 我们使用参数 intent (ShareActivity) 调用 startActivity(intent)
  3. ShareActivity.onCreate() 被调用,我们开始 Twitter oAuth 身份验证过程。
  4. 显示网络浏览器 Activity ,用户输入他们的 Twitter 凭据。
  5. Twitter 然后显示重定向回应用程序页面。
  6. Twitter 回调 URL myapp://twitter
  7. Intent 过滤器被触发,导致创建并显示 ShareActivity 的新 Activity 实例。
  8. ShareActivity 然后将推文发送到 Twitter,推文成功发布到用户墙上。
  9. ShareActivity 然后调用 finish()

问题

一切正常,直到第 9 点。调用 finish() 不会返回到原始 MainActivity 它只是关闭 ShareActivity 并返回到显示“将您重定向回应用程序”页面的浏览器 Activity .

如果用户点击后退按钮,他们将通过所有 Twitter 身份验证页面返回,然后最终返回到 MainActivity。

应该发生什么

当发布推文并且我们完成了 ShareActivity 时,原始的 MainActivity 应该返回到(在它的原始状态)。

ShareLib 正在处理所有的身份验证和发布步骤,我无法控制它如何创建新 Activity 。

当我创建我的 ShareActivity 时,我尝试发送标志 FLAG_ACTIVITY_NEW_TASK 以创建一个新的 Activity 堆栈,但我不知道如何关闭该堆栈中的所有 Activity 并返回 MainActivity。

非常感谢任何帮助。

最佳答案

在启动 Activity 步骤 2 时,在 Intent 中使用此标志 - FLAG_ACTIVITY_NO_HISTORY

或尝试使用转发,Android 示例中有一个示例 here

关于android - 如何关闭整个任务堆栈的 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9276394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com