活动流程:当我想恢复活动时调用OnCreate

时间:2015-12-25 13:42:27

标签: android facebook android-activity android-lifecycle

我的应用要求用户使用Facebook登录。一旦他们这样做,每次打开应用程序时都会检查Facebook令牌,这样我们就不会要求他们再次登录 - 我们会将它们直接重定向到MainActivity

请注意,这是一个“空视图”活动 - 我没有使用setContentView将其设置为视图,它纯粹用于决策。

public class DecisionActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());

        if (AccessToken.getCurrentAccessToken() != null) {
                Intent intent = new Intent(this, MainActivity.class);
                startActivity(intent);
        } else {
            Intent startIntent = new Intent(this, SignUpActivity.class);
            startActivity(startIntent);
            finish();
        };
    }
}

这是我的MainActivity代码。请注意,我在onCreate中调用了我的网络操作,因为我不想在每次最小化应用时调用它们,并在活动onResumes时最大化我的应用。我创建活动时必须调用一次。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //show my progress bar
        //CALL MY API TO GET SOME DATA FROM THE SERVER
        //hide my progress bar after data is received.
    }
}

这完美无缺。如果用户已登录,则每次都会将其重定向到我的MainActivity。如果用户尚未登录,则会转到SignUpActivity

然而,我今天发现的这段代码有一个令人讨厌的副作用。方案1 on onResuming我的应用程序以我希望它的工作方式工作。 方案2 on onResuming我的应用按照我希望的方式工作。

情景1:

如果您在MainActivity中并且最小化了应用并按下方形按钮,找到您的应用并再次最大化,则不会仅将活动onCreate称为活动onResumes因此不会执行网络操作,不显示进度条,这就是我想要的。

情景2:

但是,如果您最小化您的应用并决定点击手机上的应用图标,则会启动DecisionActivity,这将决定MainActivity是否需要在用户已登录时启动并且令牌存在。由于MainActivity已重新启动,因此会调用onCreate并执行网络活动,并显示进度条,我想要的内容。

当我点击手机上的应用图标时,如何阻止这种情况发生?

我现在检查了像Facebook这样的热门应用,看看他们是否有同样的问题,通过测试场景1 场景2 ,他们似乎没有遇到这个问题这个问题让我想到我用来检查某人是否登录DecisionActivity下的应用程序的设置是否可以更好地完成。

1 个答案:

答案 0 :(得分:1)

我确信存在一种更优雅的方式,但这就是我的最爱:

尝试使用SharedPreferences。因此,当您的应用程序最小化时,将调用onPause()方法。在此方法中,将SharedPreference设置为false,这意味着您现在不想运行进度条。检查MainActivity的onCreate()方法中的SharedPreference。恢复应用程序后,将SharedPreference设置为true。

所以这意味着每当用户使用onPause()方法时,如果进入方案1,进度条就不会运行(因为那时他会点击onResume(),这会赢得' t显示进度条)或者他是否经历了场景2(因为您的SharedPreference是假的,并且您事先在MainActivity' onCreate()中检查了它的值。)

但是,现在你还必须使用onFinish()或onDestroy()方法,并将SharedPreference的值更改为true,这将使下次启动应用程序时显示进度条。

我能想到的唯一缺陷就是我不确定如果用户从“最近”菜单关闭应用程序,是否会调用onDestroy()方法,或者如果Android mamory cleaner关闭应用程序以释放记忆,所以请尝试并告诉我它是否有效。

我同意这只是一个黑客而不是一个合适的解决方案,但如果它有效,那就足够了;)