首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onResume调用noHistory活动

onResume调用noHistory活动
EN

Stack Overflow用户
提问于 2014-06-15 19:33:48
回答 2查看 696关注 0票数 0

我有两个活动,LoginActivityMainActivity

LoginActiviy是启动程序活动,它的目的是检查用户是否已登录;转到MainActivity

尽管我将android:noHistory="true"设置为LoginActivity,但当用户退出(即onPause调用)程序并再次启动该程序时,将再次调用活动的onResume(LoginActivity)

我是否误解了noHistory的意思?如果是这样的话,我能做些什么让操作系统忘记LoginActivity的存在?

编辑:我试着把这个放在LoginActivityonResume上,但它叫MainActivity's onCreate,我不想要。

代码语言:javascript
复制
if(!firstTime) {
    goToMainActivity();
}

LoginActivity:

代码语言:javascript
复制
public class LoginActivity extends Activity {
protected static final String PASSED_TWITTER =    "mosaed.thukair.alsafytooth.LoginActivity";
private static final String TAG = "mosaed.thukair.alsafytooth.LoginActivity";
protected static final int RESULT_BROWSER = 0;
private SharedPreferences prefs;

private Twitter twitter;
private RequestToken requestToken;
private AccessToken accessToken;
private String authUrl;

private Button login;
private boolean firstTime;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
    firstTime = true;
    if(isAuthenticated()) {
        Log.i(TAG, "splash screen");
        setContentView(R.layout.splash_screen);
        String token = prefs.getString(Constants.OAUTH_TOKEN, "");
        String tokenSecret = prefs.getString(Constants.OAUTH_TOKEN_SECRET, "");
        Log.i(TAG, "oauth login");
        OAuthLogin(token, tokenSecret);
    } else {
        setContentView(R.layout.activity_login);

        login = (Button) findViewById(R.id.connect_button);
        login.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Log.i(TAG, "clicked");
                LoginActivity.this.setContentView(R.layout.splash_screen);
                OAuthLogin();
            }

        }); 
    }
}

private boolean isAuthenticated() {

    String token = prefs.getString(Constants.OAUTH_TOKEN, "");
    if(token.equals(""))
        return false;
    String secret = prefs.getString(Constants.OAUTH_TOKEN_SECRET, "");
    if(secret.equals(""))
        return false;

    return true;

}

private void OAuthLogin() {
    twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);

    new AsyncTask<Void,Void,Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                requestToken = twitter.getOAuthRequestToken(Constants.CALLBACK_URL);
                authUrl = requestToken.getAuthenticationURL();
                Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl));
                myIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | 
                        Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND);
                Log.i(TAG, "open browser");
                LoginActivity.this.startActivity(myIntent);
            } catch (TwitterException e) {
                e.printStackTrace();
            }
            return null;
        }

    }.execute();
}

private void OAuthLogin(final String token, final String tokenSecret) {
    twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);

    new AsyncTask<Void,Void,Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            AccessToken accessToken = new AccessToken(token, tokenSecret);
            twitter.setOAuthAccessToken(accessToken);
            return null;
        }

        @Override
        protected void onPostExecute(Void param) {
            goToMainActivity(twitter);
        }

    }.execute();
}

@Override
protected void onResume() {
    super.onResume();
    Log.i(TAG, "onResume");
    if ((this.getIntent() != null) && (this.getIntent().getData() != null)) {
        setContentView(R.layout.splash_screen);

        new AsyncTask<Void,Void,Void>() {

            @Override
            protected Void doInBackground(Void... params) {
                Uri uri = LoginActivity.this.getIntent().getData();
                afterBrowser(uri);
                return null;
            }

            @Override
            protected void onPostExecute(Void uri) {
                storeAccessToken();
                goToMainActivity(twitter);
            }

        }.execute();
    } else if(!firstTime) {
        goToMainActivity(twitter);
    }
}

private void afterBrowser(Uri uri) {
    String verifier = uri.getQueryParameter("oauth_verifier");
    String token = uri.getQueryParameter("oauth_token");
    try {
        twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
        requestToken = new RequestToken(token, Constants.CONSUMER_SECRET);
        accessToken = twitter.getOAuthAccessToken(requestToken,
                        verifier);
        twitter.setOAuthAccessToken(accessToken);
    } catch (TwitterException ex) {
        Log.e(TAG, "" + ex.getMessage());
    }
}

private void storeAccessToken() {
    prefs.edit()
        .putString(Constants.OAUTH_TOKEN, accessToken.getToken())
        .putString(Constants.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret())
        .commit();
}

private void goToMainActivity(Twitter twitter) {
    firstTime = false;
    Intent myIntent = new Intent(this, MainActivity.class);
    MyApplication.getInstance().setTwitter(twitter);
    startActivity(myIntent);
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-15 19:41:10

代码语言:javascript
复制
if(!firstTime) {
    goToMainActivity();
    finish();
}

没有历史记录做的是,它不允许某个活动在过去的活动堆栈中注册,它不允许它跳过活动生命周期的部分。

如果不希望某些代码不执行,则应该执行以下操作:

登录活动:

代码语言:javascript
复制
if(!firstTime) {
    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
    intent. putExtra("skip", true);
    finish();
}

主要活动:(在onCreate内部)

代码语言:javascript
复制
if(!getIntent().getBundle().getBoolean("skip", false)) {
    //You code that you don't want
}

这就是活动的生命周期,我希望它对你有益:

票数 0
EN

Stack Overflow用户

发布于 2014-06-15 19:40:08

android:当用户离开活动栈时,它是否应该从活动堆栈中删除并完成(调用了它的finish()方法),并且它在屏幕上不再可见--如果应该完成,则为"true“;如果不是,则为"false”。默认值为"false“。"true“的值意味着活动不会留下历史痕迹。它不会停留在任务的活动堆栈中,因此用户将无法返回它。

代码语言:javascript
复制
This attribute was introduced in API Level 3.

引用文档的话,“它是调用的finish()方法”,您是否尝试过自己完成这个活动?

noHistory = true意味着一旦该活动为该用户会话的finish(),用户将永远不会再看到它,但是,如果该活动只是在没有完成的情况下暂停,那么它将在返回到它时重新启动。在进入主活动之前,只要完成()它,如果这是您想要的行为的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24233347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档