2

我正在使用庫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> 

流量:

  1. 使用點擊在MainActivity分享按鈕。
  2. 我們稱startActivity(intent)與論據(ShareActivity)。
  3. ShareActivity.onCreate()被調用,我們開始Twitter oAuth認證過程。
  4. 顯示Web瀏覽器活動並且用戶輸入他們的Twitter憑證。
  5. Twitter然後顯示重定向回到應用程序頁面。
  6. Twitter回撥至URL myapp://twitter
  7. 意圖過濾器被觸發,導致創建並顯示ShareActivity的新活動實例。
  8. 然後ShareActivity將Tweet發送到Twitter,並將Tweet成功發佈到用戶牆上。然後
  9. ShareActivity調用finish()

問題

一切工作,直到9點調用finish()不會返回它只是關閉ShareActivity並返回到瀏覽器的活動顯示原始MainActivity的「將您重定向迴應用程序「頁面。

如果用戶點擊返回按鈕,它們將通過所有Twitter認證頁面收回,然後返回到MainActivity。

應該發生什麼

當鳴叫張貼,我們已經與ShareActivity原MainActivity應歸還完畢(在它的原始狀態)。

ShareLib正在處理所有的認證和發佈步驟,我無法控制它如何創建新的活動。

當我創建我的ShareActivity時,我嘗試發送Flag FLAG_ACTIVITY_NEW_TASK標誌,它會創建一個新的活動堆棧,但我不知道如何關閉堆棧中的所有活動並返回MainActivity。

任何幫助將非常感激。

回答

1

使用此標誌 - FLAG_ACTIVITY_NO_HISTORY的意圖,當你開始練習步驟2

,或者嘗試使用轉發,樣品的例子是目前android的樣品here

+0

我已經嘗試過'FLAG_ACTIVITY_NO_HISTORY',但它似乎只是阻止ShareActivity進入活動堆棧,所有的Twitter認證步驟仍然在活動堆棧中,並且它們被創建爲SocialLib。 – Camsoft 2012-02-14 12:15:58

+0

好吧,那麼在第2步中使用FLAG_ACTIVITY_CLEAR_TOP如何呢?它應該清除整個堆棧,讓你回到第一個活動。 – bluefalcon 2012-02-14 12:25:47

+0

SocialLib庫似乎正在創建一項新任務。所以當Twitter回撥新的實例時,會創建一個新的實例ShareActivity。所以我不能使用任何標誌來恢復以前的活動,因爲它在原始任務堆棧中。 – Camsoft 2012-02-14 14:52:54

0

中您可以使用System.exit(0);

試試吧......

+0

它只是關閉ShareActivity並返回瀏覽器活動,顯示「重定向你回到應用程序」推文頁面。 – Camsoft 2012-02-14 13:52:27

+0

System.exit(0)是一個直接進入虛擬機的java調用,不應該在android上使用。你有一些方法可以正確處理堆棧 – Tancho 2013-02-28 10:46:28

0

意圖使用FLAG_ACTIVITY_CLEAR_TOP。當你調用finish()時也是如此。通過使用startActivity()賦予mainactivity意圖。也覆蓋onkeydown()函數。檢查是否按下了鍵。

@覆蓋 公共布爾的onkeydown(INT的keyCode,KeyEvent的事件){// TODO自動生成方法存根

if(keyCode == KeyEvent.KEYCODE_BACK){ 


    } 
    return super.onKeyDown(keyCode, event); 
} 

有寫代碼清除整個活動堆棧