繁体   English   中英

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

[英]Activity flow: OnCreate called when I want to resume my activity

我的应用程序要求人们使用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转到SignUpActivity

但是,我今天发现的这个代码有一个令人讨厌的副作用。 方案1 on onResuming我的应用程序以我希望它的工作方式工作。 场景2 on onResuming我的应用程序不能按我想要的方式工作。

场景1:

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

场景2:

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

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

我现在检查像Facebook这样的流行应用程序,通过测试方案1方案2来查看它们是否有相同的问题,它们似乎没有遇到这个问题,这让我想到我用来检查是否有人登录的设置在DecisionActivity下的我的应用程序可以更好的方式完成。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM