【问题标题】:onResume called on noHistory activityonResume 调用 noHistory 活动
【发布时间】:2014-06-15 19:33:48
【问题描述】:

我有两个活动,LoginActivityMainActivity

LoginActiviy是启动器Activity,它的目的是检查用户是否登录,如果他已经登录;转到MainActivity

虽然我将android:noHistory="true" 设置为LoginActivity,但当用户退出(意味着onPause 调用)程序并再次启动它时,活动的onResume(LoginActivity) 会再次被调用。

我是否误解了noHistory 的含义?如果是这样,我该怎么做才能让操作系统忘记LoginActivity 的存在?

编辑:我试图把它放在 LoginActivityonResume 上,但它调用 MainActivityonCreate,这是我不想要的

if(!firstTime) {
    goToMainActivity();
}

登录活动:

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);
}

}

【问题讨论】:

  • @eikooc 不,他在询问活动堆栈,在我的情况下,我不关心堆栈,因为我关心调用 First Acitiy 的 onResume
  • 哇,自从我标记后,这个问题似乎也发生了很大变化
  • 发布您的LoginActivity 代码

标签: android lifecycle


【解决方案1】:
if(!firstTime) {
    goToMainActivity();
    finish();
}

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

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

登录活动:

if(!firstTime) {
    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
    intent. putExtra("skip", true);
    finish();
}

主要活动:(在onCreate中)

if(!getIntent().getBundle().getBoolean("skip", false)) {
    //You code that you don't want
}

这是activity的生命周期,希望对你有所帮助:

【讨论】:

  • 什么都没发生……同样的。它也会调用 MainActivity 的 onCreate .. 我不想要那个,我想调用 onResume 。
  • Marouk ...我试过了,但是 MainActiviy 的变量和对象被重新初始化了..我不想要那个..我想调用 MainActivity 的 onResume
【解决方案2】:

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

This attribute was introduced in API Level 3.

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

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

【讨论】:

  • 我试过了,我自己调用了 finish(),但没有解决任何问题,它使 firstTime 变量也重新初始化,这不会让我使用我的半解决方案。
  • 在onPause()方法中也添加finish()
  • 我不能。 LoginActivity 将打开另一个活动(网络浏览器)。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多