android 如何使FirebaseApp在返回MainActivity时不再初始化?

r1wp621o  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(152)

我是一个初学者在学习Android工作室和不好的英语。
我在android应用程序中有两个Firebase项目,并在下面编写这些代码。

FirebaseOptions options1 = new FirebaseOptions.Builder()
                .setProjectId("fd-login-20e78")
                .setApplicationId("...")
                .setApiKey("...")
                .build();

        FirebaseOptions options2 = new FirebaseOptions.Builder()
                .setProjectId("fd-login1-dc1f7")
                .setApplicationId("...")
                .setApiKey("...")
                .build();

        FirebaseApp.initializeApp(this , options1, "first");
        FirebaseApp.initializeApp(this , options2, "secondary");

        FirebaseApp first = FirebaseApp.getInstance("first");
        FirebaseApp secondary = FirebaseApp.getInstance("secondary");

它工作得很好,没有任何崩溃。但是当我试图从其他活动返回到MainActivity时,它总是崩溃并出现以下错误:

原因:java.lang.IllegalStateException:FirebaseApp名称第一个已存在!

我知道这个问题是因为FirebaseApp被重新初始化了。当我回到MainActivity时,我该如何停止它呢?
我尝试过这种方法来解决这个问题,但它没有工作。下面的代码使应用程序立即崩溃。错误显示它没有初始化任何东西。

if (FirebaseApp.getApps(this).isEmpty()) {
    FirebaseApp.initializeApp(this , options1, "first");
    FirebaseApp.initializeApp(this , options2, "secondary");
}

修改

public class MainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {

    private TextView tv_register, tv_forget;
    private EditText ed_email1, ed_password1;
    private Button btn_login;
    private RadioGroup radioGroup;
    RadioButton rb1, rb2, rb3;
    private FirebaseAuth mAuth, mAuth2, mAuth3, login;
    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    FirebaseApp first,secondary;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_register = findViewById(R.id.tv_register2);
        tv_register.setOnClickListener(this);

        tv_forget = findViewById(R.id.tv_forget2);
        tv_forget.setOnClickListener(this);

        btn_login = findViewById(R.id.btn_login2);
        btn_login.setOnClickListener(this);

        ed_email1 = findViewById(R.id.ed_email2);
        ed_password1 = findViewById(R.id.ed_password2);

        rb1 = findViewById(R.id.rb1);
        rb2 = findViewById(R.id.rb2);
        rb3 = findViewById(R.id.rb3);
        radioGroup = findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(this);

        FirebaseOptions options1 = new FirebaseOptions.Builder()
                    .setProjectId("fd-login-20e78")
                    .setApplicationId("...")
                    .setApiKey("...")
                    .build();

        FirebaseOptions options2 = new FirebaseOptions.Builder()
                    .setProjectId("fd-login1-dc1f7")
                    .setApplicationId("...")
                    .setApiKey("...")
                    .build();

            FirebaseApp.initializeApp(this , options1, "first");
            FirebaseApp.initializeApp(this , options2, "secondary");

        first = FirebaseApp.getInstance("first");
        secondary = FirebaseApp.getInstance("secondary");

        mAuth = FirebaseAuth.getInstance(first);
        mAuth2 = FirebaseAuth.getInstance(secondary);
    }
l7wslrjt

l7wslrjt1#

如果可以选择使用onBackPressed()返回到MainActivity(),也就是说,如果第二个Activity从MainActivity()加载,而您只想返回,请在MainActivity()onCreate()方法中编写Firebase初始化逻辑,并在第二个Activity中使用onBackPressed()返回到MainActivity(),如下所示:
而不是以下内容:

val intent = Intent(this, MainActivity :: class.java)
startActivity(intent)

就这样写:

onBackPressed()

如果您在片段中,请使用以下命令:

activity?.onBackPressed()

这样,由于您使用的是onBackPressed()函数而不是intent,因此将不会创建MainActivity()的新示例,而会加载回栈中可用的相同示例。因此,将不会再次调用onCreate()。相反,将调用onResume(),从而不会运行初始化逻辑。

3qpi33ja

3qpi33ja2#

你可以创建一个Application类,它的onCreate()方法只在应用开始时被调用,此后不再被调用。为此,你可以创建一个单独的java类,名为MyApplication(或者你喜欢的任何名字),用Application类扩展它,并在它的onCreate()方法中,执行你的代码,如下所示:

public class MyApplication extends Application {

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

        FirebaseOptions options1 = new FirebaseOptions.Builder()
                .setProjectId("fd-login-20e78")
                .setApplicationId("...")
                .setApiKey("...")
                .build();

        FirebaseOptions options2 = new FirebaseOptions.Builder()
                .setProjectId("fd-login1-dc1f7")
                .setApplicationId("...")
                .setApiKey("...")
                .build();

        FirebaseApp.initializeApp(this , options1, "first");
        FirebaseApp.initializeApp(this , options2, "secondary");

        FirebaseApp first = FirebaseApp.getInstance("first");
        FirebaseApp secondary = FirebaseApp.getInstance("secondary");
    }
}

您还需要做的一件事是在application标记内的AndroidManifest中声明MyApplication名称,如下所示:

android:name=".MyApplication"

就这样。有什么坏了就告诉我。

相关问题