我希望我的 Android 应用能够从应用启动时开始侦听 Firebase 数据库引用,直到应用终止。
通过在应用程序的onCreate
中的数据库引用处添加 ValueEventListener 并在应用程序的onTerminate
中删除它来实现所需的行为:
public class My_Application extends Application {
// The DB ref that the ValueEventListener will be added to.
DatabaseReference dbRef = V_DB.FBREF_CHATROOMS;
// Used to remove ValueEventListeners that were added in this class.
Pair<DatabaseReference, ValueEventListener> mListener;
@Override
public void onCreate() {
super.onCreate();
// Add the ValueEventListener.
ValueEventListener mValueEventListener = dbRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Do something here.
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Do something here.
}
});
// Store listener.
mListener = new Pair<>(dbRef, mValueEventListener);
}
@Override
public void onTerminate() {
super.onTerminate();
// Remove listener.
mListener.first.removeEventListener(mListener.second);
}
}
这似乎是显而易见的路,但正如这里所说的Application.onCreate
:
实现应该尽可能快(例如使用状态的延迟初始化(,因为在此函数中花费的时间直接影响启动进程中第一个活动、服务或接收器的性能。
考虑到上述情况(并且不排除其他潜在问题(,我想问一下,当您想要应用程序范围的ValueEventListener时,我的方法是否是要走的路,或者是否有其他更有效的方法。
按照Ronak Makwana的建议,我使用服务将我所有应用程序范围的ValueEventListeners
添加到SplashScreenActivity的onCreate()
中。该服务在我的 SplashScreenActivity onDestroy()
中停止。在我的服务onDestroy()
中,我删除了我添加的所有应用范围的 ValueEventListeners。
@Override
protected void onCreate(Bundle savedInstanceState) {
// Do other stuff
// Start service for adding App-Wide Listeners.
this.startService_AddAppwideValuEventListeners();
}
@Override
protected void onDestroy() {
super.onDestroy();
// Stop Service (by doing so, all App-Wide Listenersare removed in Service's onDestroy().
stopService(new Intent(this, Service_AddAppwideValuEventListeners.class));
}
// Start Service
private void startService_AddAppwideValuEventListeners() {
// Get Intent for starting my Service that adds some VELs.
Intent mServiceIntent = new Intent(this, Service_AddAppwideValuEventListeners.class);
// Start service (this service is stopped in Activity's onDestroy())
wCurrentContext.startService(mServiceIntent);
}
到目前为止,它就像一个魅力,这样做的开销非常低(因为一切都是在服务中完成的(。