我正在使用庫SocialLib向我的應用程序添加共享功能。我遇到了oAuth回調的真正問題。如何關閉活動的整個任務堆棧?
我創建了以下活動,以共享的處理:從活動(MainActivity),我想分享我從調用下面的啓動ShareActivity
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();
}
}
的:
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)。 ShareActivity.onCreate()
被調用,我們開始Twitter oAuth認證過程。- 顯示Web瀏覽器活動並且用戶輸入他們的Twitter憑證。
- Twitter然後顯示重定向回到應用程序頁面。
- Twitter回撥至URL
myapp://twitter
- 意圖過濾器被觸發,導致創建並顯示ShareActivity的新活動實例。
- 然後ShareActivity將Tweet發送到Twitter,並將Tweet成功發佈到用戶牆上。然後
- ShareActivity調用
finish()
問題
一切工作,直到9點調用finish()
不會返回它只是關閉ShareActivity並返回到瀏覽器的活動顯示原始MainActivity的「將您重定向迴應用程序「頁面。
如果用戶點擊返回按鈕,它們將通過所有Twitter認證頁面收回,然後返回到MainActivity。
應該發生什麼
當鳴叫張貼,我們已經與ShareActivity原MainActivity應歸還完畢(在它的原始狀態)。
ShareLib正在處理所有的認證和發佈步驟,我無法控制它如何創建新的活動。
當我創建我的ShareActivity時,我嘗試發送Flag FLAG_ACTIVITY_NEW_TASK標誌,它會創建一個新的活動堆棧,但我不知道如何關閉堆棧中的所有活動並返回MainActivity。
任何幫助將非常感激。
我已經嘗試過'FLAG_ACTIVITY_NO_HISTORY',但它似乎只是阻止ShareActivity進入活動堆棧,所有的Twitter認證步驟仍然在活動堆棧中,並且它們被創建爲SocialLib。 – Camsoft 2012-02-14 12:15:58
好吧,那麼在第2步中使用FLAG_ACTIVITY_CLEAR_TOP如何呢?它應該清除整個堆棧,讓你回到第一個活動。 – bluefalcon 2012-02-14 12:25:47
SocialLib庫似乎正在創建一項新任務。所以當Twitter回撥新的實例時,會創建一個新的實例ShareActivity。所以我不能使用任何標誌來恢復以前的活動,因爲它在原始任務堆棧中。 – Camsoft 2012-02-14 14:52:54