如何仅在应用程序启动时调用方法?请查看详情

How to call a method only when the app has been launched? Please see details

我有一种方法可以从 firebase 数据库中获取用户的详细信息和一些数据。

问题是该方法在启动应用程序后被调用两次或三次,当我从任何其他应用程序返回时再次调用 activity。

我已经将该方法放入 onCreate 方法中,如下所示:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        checkAuthState();
    }

我确定我没有在 onStart()onResume() 方法中调用 checkAuthState()

这就是我从其他 activity:

返回的方式
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

请告诉我为什么 checkAuthState() 被调用三次,为什么在从任何其他 activity 返回时再次调用它,以及如何在应用程序被调用时仅调用一次此方法启动了吗?

抱歉,如果问题的格式似乎有误。我还是初学者!

创建启动器 activity 以检查 AuthStatus。 启动一个新的 activity 并终止启动器 activity。

将您的 onCreate() 方法更改为

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    if(savedInstanceState == null){
        checkAuthState();
    }

}

您可以扩展应用程序并在 onCreate 中添加您自己的功能,就像 Activity 一样。要创建您自己的应用程序 class,请像这样更改清单中的应用程序名称:

<application
    android:name=".MyApplication"
    ...
</application>

然后,您可以这样声明 MyApplication:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        checkAuthState();
    }
}

当然,checkAuthState 必须在 MyApplication 中。我建议的另一种解决方案是使用 Firebase.AuthChangeListener:

验证身份验证更改
// Listener to the user's authentication token expiration
Firebase.AuthStateListener authListener = new Firebase.AuthStateListener() {
    @Override
    public void onAuthStateChanged(AuthData authData) {
        checkAuthState();
    }
};
mFirebaseReference.addAuthStateListener(authListener);