Как закрыть весь стек заданий? - PullRequest
2 голосов
/ 14 февраля 2012

Я использую библиотеку 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);

Я использую фильтр намерений, чтобы 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) с аргументом intent (ShareActivity).
  3. ShareActivity.onCreate() вызывается, и мы запускаем процесс аутентификации Twitter oAuth.
  4. Отображается активность веб-браузера, и пользователь вводит свои учетные данные Twitter.
  5. Затем Twitter отображает перенаправление на страницу приложения.
  6. Twitter перезванивает на URL myapp://twitter
  7. Срабатывает фильтр намерений, в результате чего создается и отображается новый экземпляр действия ShareActivity.
  8. ShareActivity затем отправляет твит в Твиттер, а твит успешно публикуется на стене пользователя.
  9. ShareActivity затем вызывает finish()

Задача

Все работает вплоть до пункта 9. Вызов finish() не возвращает исходную MainActivity, он просто закрывает ShareActivity и возвращает к активности браузера, отображая страницу «Перенаправление обратно в приложение».

Если пользователь нажимает кнопку «Назад», его возвращают обратно через все страницы авторизации в Твиттере и затем в конечном итоге возвращают в MainActivity.

Что должно произойти

Когда Tweet опубликован, и мы закончили с ShareActivity, исходная MainActivity должна быть возвращена (в исходном состоянии).

ShareLib обрабатывает все этапы аутентификации и публикации, и я не могу контролировать, как он создает новые действия.

Когда я создавал свою ShareActivity, я пытался отправить флаг FLAG_ACTIVITY_NEW_TASK с идеей, что это создаст новый стек действий, но я не знаю, как закрыть все действия в этом стеке и вернуться к MainActivity.

Любая помощь будет очень признательна.

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Используйте этот флаг - FLAG_ACTIVITY_NO_HISTORY в намерении при запуске шага действия 2.

или попробуйте использовать переадресацию, пример примеров присутствует в примерах Android здесь

0 голосов
/ 14 февраля 2012

используйте FLAG_ACTIVITY_CLEAR_TOP для намерения.также когда вы вызываете финиш ().с помощью startActivity () дать намерение mainacctivity.также переопределить функцию onkeydown ().проверка на кнопку нажата или нет.

@ Переопределить public boolean onKeyDown (int keyCode, KeyEvent event) {// TODO Сгенерированный автоматически метод заглушки

    if(keyCode == KeyEvent.KEYCODE_BACK){


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

там пишется код для очистки всего стека активности

0 голосов
/ 14 февраля 2012

Вы можете использовать System.exit(0);

Попробуйте ...

...