【问题标题】:How to close an entire task stack of activites?如何关闭整个活动的任务堆栈?
【发布时间】:2012-02-14 11:54:55
【问题描述】:

我正在使用库 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();
    }
}

我想从中分享的活动 (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>

流程:

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

问题

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

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

会发生什么

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-activity oauth android-intent android-2.2-froyo


    【解决方案1】:

    在您启动活动第 2 步时,在意图中使用此标志 - FLAG_ACTIVITY_NO_HISTORY

    或尝试使用转发,android 示例中存在示例示例here

    【讨论】:

    • 我已经尝试过FLAG_ACTIVITY_NO_HISTORY,但它似乎只能阻止 ShareActivity 进入活动堆栈,所有 Twitter 身份验证步骤仍在活动堆栈中,并且它们是由 SocialLib 创建的。
    • 好的,在第 2 步中使用 FLAG_ACTIVITY_CLEAR_TOP 怎么样。它应该清除整个堆栈,带您回到第一个活动。
    • SocialLib 库似乎正在创建一个新任务。所以当 Twitter 回调一个新实例 ShareActivity 时,新任务中就创建了。所以我不能使用任何标志来恢复以前的活动,因为它在原始任务堆栈中。
    • 这是调试的主要数据点。尝试使用标志 - singleTask 声明您的活动。这确保了如果活动之前已经启动并且它在不同的堆栈中,那么整个堆栈都会被带到前台。查看link中的图4及说明。
    • 如果我们使用标志-singleTask,那么来自认证页面的intent数据不会被传递到activity..
    【解决方案2】:

    你可以使用System.exit(0);

    试试看……

    【讨论】:

    • 它只是关闭了 ShareActivity 并返回到浏览器活动,显示“将您重定向回应用程序”推特页面。
    • System.exit(0) 是一个直接进入虚拟机的 java 调用,不应在 android 上使用。您有一些方法可以正确处理堆栈
    【解决方案3】:

    使用 FLAG_ACTIVITY_CLEAR_TOP 表示意图。当你调用finish()时也是如此。通过使用 startActivity() 给予 mainactivity 的意图。还覆盖 onkeydown() 函数。检查是否按下了后键。

    @覆盖 public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO 自动生成的方法存根

        if(keyCode == KeyEvent.KEYCODE_BACK){
    
    
        }
        return super.onKeyDown(keyCode, event);
    }
    

    写一段代码来清除整个活动堆栈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多