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



我是Android studio的初学者,英语不好。

我在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 name first已经存在!

我知道问题发生是因为FirebaseApp再次初始化。当我回到mainactivity时,我怎么能停止它呢?

我试过用这种方法来解决这个问题,但是没有用。下面的代码使应用程序立即崩溃。Errors显示它没有初始化任何东西。
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);
}

如果使用onBackPressed()返回MainActivity()是一个选项,这意味着如果第二个活动是从MainActivity()加载的,你只是想回去,在MainActivity()onCreate()方法中编写Firebase初始化逻辑,并在第二个活动中使用onBackPressed()返回到MainActivity(),如下所示:

而不是下面的:

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

就这样写:

onBackPressed()

如果你在一个片段中使用这个:

activity?.onBackPressed()

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

你可以创建一个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"

就是这样。如果有东西坏了,告诉我。

最新更新