事情是这样的,我的应用程序有一个服务(扩展服务)负责建立套接字连接并使用 firebase 原生 android 框架监听传入的网络流量。这是它的样子
public class SocketService extends Service {
private Firebase firebase;
@Override
public void onCreate() {
super.onCreate();
firebase = AppHelper.getInstance().getFirebase().child(AppHelper.getInstance().getFirebase().getAuth().getUid());
AppHelper.getInstance().categoriesController.setListeners(firebase.child("categories"));
AppHelper.getInstance().tablesController.setListeners(firebase.child("tables"));
AppHelper.getInstance().itemsController.setListeners(firebase.child("items"));
AppHelper.getInstance().requestsController.setListeners(firebase.child("requests"));
AppHelper.getInstance().ordersController.setListeners(firebase.child("orders"));
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
AppHelper.getInstance().categoriesController.removeListeners(firebase.child("categories"));
AppHelper.getInstance().tablesController.removeListeners(firebase.child("tables"));
AppHelper.getInstance().itemsController.removeListeners(firebase.child("items"));
AppHelper.getInstance().ordersController.removeListeners(firebase.child("orders"));
AppHelper.getInstance().requestsController.removeListeners(firebase.child("requests"));
AppHelper.getInstance().clearUserData();
AppHelper.getInstance().waiter = null;
AppHelper.getInstance().setConnectionState(false);
}
}
如您所见,onStartCommand 返回 START_NOT_STICKY,因此服务不会在我离开应用程序后立即被终止(在后台 - 中间按钮上)
以下是 AppHelper 的工作原理:
public class AppHelper extends Application {
private static AppHelper instance = null;
private static Bus bus;
public TablesController tablesController;
public OrdersController ordersController;
public ItemsController itemsController;
public RequestsController requestsController;
public CategoriesController categoriesController;
private Firebase firebase;
public Waiter waiter;
private boolean connected = false;
public static AppHelper getInstance() {
return instance;
}
public Bus getBus() {return bus;}
@Override
public void onCreate() {
super.onCreate();
instance = this;
bus = new Bus();
tablesController = new TablesController(this);
ordersController = new OrdersController(this);
itemsController = new ItemsController(this);
requestsController = new RequestsController(this);
categoriesController = new CategoriesController(this);
Firebase.setAndroidContext(this);
firebase = new Firebase("https://restapp.firebaseio.com/");
// other setup code
}
public Firebase getFirebase() {
return firebase;
}
public void clearUserData() {
tablesController.clearData();
ordersController.clearData();
itemsController.clearData();
requestsController.clearData();
categoriesController.clearData();
}
public void setConnectionState(boolean connected) {
this.connected = connected;
bus.post(new NetworkStateEvent(connected));
}
public boolean isConnected() {
return connected;
}
}
每个控制器向相应节点注册一个 firebase 侦听器,这是基类的外观
public abstract class BaseController<T> {
protected Handler handler;
protected Firebase node;
protected ArrayList<T> models = new ArrayList<>();
protected ChildEventListener eventListener;
public BaseController(Context context) {
handler = new Handler(context.getMainLooper());
eventListener = getEventListener();
}
public void setListeners(Firebase node) {
this.node = node;
node.addChildEventListener(eventListener);
}
abstract ChildEventListener getEventListener();
public void removeListeners(Firebase node) {
models.clear();
node.removeEventListener(eventListener);
}
public ArrayList<T> getItems() {
return models;
}
public void clearData() {
models.clear();
}
}
所以,这就是发生的事情。一切都很好,如果您将应用程序留在后台并返回它仍然可以工作,您甚至可以启动其他应用程序,锁定设备等。但是,如果您将应用程序留在后台足够长的时间(10 分钟左右),当您回来firebase不会响应。该应用程序不会崩溃,但它什么也不做,就像它处于离线状态一样。我猜有些东西正在被收集起来。但我不知道那可能是什么。
我试过这个
connectedRef = new Firebase("https://restapp.firebaseio.com/.info/connected");
connectionStateListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
AppHelper.getInstance().setConnectionState(connected);
}
@Override
public void onCancelled(FirebaseError error) {
System.err.println("Listener was cancelled");
}
};
connectedRef.addValueEventListener(connectionStateListener);
并在 firebase 断开连接时在用户的片段上显示一条消息。当我在 10 分钟后回到应用程序时,这条消息不存在(那个 firebase 已连接?)。
先感谢您!。