我正在使用库SocialLib向我的应用添加共享功能。我在使用oAuth回调时遇到了实际问题。
我创建了以下活动来处理共享:
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();
}
}
我要从中共享的活动(MainActivity)中,我调用以下命令来启动ShareActivity:
Intent intent = new Intent(getApplicationContext(), ShareActivity.class);
intent.putExtra("service", ShareActivity.SERVICE_TWITTER);
startActivity(intent);
我正在使用一个Intent过滤器,以便Twitter(oAuth)可以回调到调用活动:
<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>
流程:
使用单击MainActivity上的“共享”按钮。
我们用参数
startActivity(intent)
(ShareActivity)调用intent
。ShareActivity.onCreate()
被调用,我们开始Twitter oAuth身份验证过程。显示网络浏览器活动,并且用户输入其Twitter凭据。
Twitter然后显示重定向回应用程序页面。
Twitter回调到URL
myapp://twitter
触发了意图筛选器,从而创建并显示了一个新的ShareActivity活动实例。
然后,ShareActivity将Tweet发送到Twitter,并将Tweet成功发布到用户墙上。
然后,ShareActivity调用
finish()
问题
一切工作到第9点为止。调用
finish()
不会返回到原始MainActivity,它只是关闭ShareActivity并返回到浏览器活动,显示“将您重定向到应用程序”页面。如果用户单击“后退”按钮,他们将被带回所有Twitter身份验证页面,然后最终回到MainActivity。
应该发生什么
发布Tweet并完成ShareActivity后,原始MainActivity应该恢复为原始状态。
ShareLib正在处理所有身份验证和发布步骤,我无法控制它如何创建新活动。
当我创建ShareActivity时,我曾尝试发送Flag FLAG_ACTIVITY_NEW_TASK,其想法是它将创建一个新的活动堆栈,但我不知道如何关闭该堆栈中的所有活动并返回MainActivity。
任何帮助将非常感激。
最佳答案
启动活动步骤2时,请有意使用此标志-FLAG_ACTIVITY_NO_HISTORY
。
或尝试使用转发,则android示例here中提供了一个示例示例