美好的一天。
我有一个问题,考虑最好的电池管理实践。
事先请不要建议 GCM Firebase ,因为我对它们不感兴趣,我会在之后说出原因。
所以这是场景。
我有一个自己部署的社交网络。
我几乎不相信 Viber , WhatsApp 或 Telegram 正在使用任何Google服务,例如 GCM 或< strong> Firebase 而且我已经使用了他们两个并且我对他们的延迟以及我收到的定价非常不满意因此对我来说最好的选择是将所有通知保留在Socket.IO。
现在每一步:
•我创建了一个始终运行的服务,无论如何都在运行。
•服务附有Socket.IO lib,服务通过Socket.IO保持与服务器的持久连接。
•该服务处理下一个所有Socket.IO逻辑:完整的应用程序通知 - 组通知,好友请求,消息通知以及所有这些通知,所有这些通知都包含在我的10种类型的通知中应用
•除非我看到我的三星S7 Edge抱怨我的应用程序的使用,否则一切都很完美。我虽然这是三星典型的抱怨之一,但当我看到电池使用时我感到震惊...我的应用程序使用比ANDROID OS更多的电池这对我来说是一个很大的打击。
我将很快向您展示我的服务代码:
我正在像这样初始化套接字。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initSocketFully();
return START_STICKY;
}
private void initSocketFully() {
sharedHelper = new SharedHelper(this);
currentUserId = sharedHelper.getUserId();
destroySocket();
try {
mSocket = IO.socket(SOCKET_URL);
} catch (URISyntaxException e) {
e.printStackTrace();
}
initSocket();
}
private void initSocket() {
mSocket.on(EVENT_CONNECT, onSocketConnected);
mSocket.on(EVENT_CONNECT_ERROR, onSocketConnectionError);
mSocket.on(EVENT_DISCONNECT, onSocketDisconnected);
mSocket.on(EVENT_NEW_MESSAGE, onNewMessageReceived);
mSocket.on(EVENT_STOPPED_TYPING, onUserStoppedTyping);
mSocket.on(EVENT_TYPING, onUserTyping);
mSocket.on(EVENT_MESSAGE_SENT, onMessageSent);
mSocket.on(EVENT_CONNECT_TIMEOUT, onSocketTimeOut);
mSocket.on(EVENT_ONLINE_STATUS, onOnlineStatusReceived);
mSocket.on(EVENT_ON_GAME_CREATED, onMafiaGameCreated);
mSocket.on(EVENT_ON_COMMENT_ADDED, onCommentAdded);
mSocket.on(EVENT_ON_FRIEND_REQUEST_ACCEPTED, onFriendRequestAccepted);
mSocket.on(EVENT_ON_FRIEND_REQUEST_DECLINED, onFriendRequestDeclined);
mSocket.on(EVENT_ON_POST_LIKED, onPostLiked);
mSocket.on(EVENT_ON_POST_MADE, onPostMade);
mSocket.on(EVENT_ON_FRIEND_REQUESTED, onFriendRequested);
mSocket.connect();
}
在服务onDestroy
的回调中销毁它,如此:
private void destroySocket() {
if (mSocket != null) {
mSocket.disconnect();
mSocket.off(EVENT_CONNECT, onSocketConnected);
mSocket.off(EVENT_ON_FRIEND_REQUEST_ACCEPTED, onFriendRequestAccepted);
mSocket.off(EVENT_CONNECT_ERROR, onSocketConnectionError);
mSocket.off(EVENT_ON_FRIEND_REQUEST_DECLINED, onFriendRequestDeclined);
mSocket.off(EVENT_DISCONNECT, onSocketDisconnected);
mSocket.off(EVENT_NEW_MESSAGE, onNewMessageReceived);
mSocket.off(EVENT_STOPPED_TYPING, onUserStoppedTyping);
mSocket.off(EVENT_ON_GAME_CREATED, onMafiaGameCreated);
mSocket.off(EVENT_TYPING, onUserTyping);
mSocket.off(EVENT_MESSAGE_SENT, onMessageSent);
mSocket.off(EVENT_CONNECT_TIMEOUT, onSocketTimeOut);
mSocket.off(EVENT_ONLINE_STATUS, onOnlineStatusReceived);
mSocket.off(EVENT_ON_COMMENT_ADDED, onCommentAdded);
mSocket.off(EVENT_ON_POST_LIKED, onPostLiked);
mSocket.off(EVENT_ON_POST_MADE, onPostMade);
mSocket.off(EVENT_ON_FRIEND_REQUESTED, onFriendRequested);
}
}
重要提示,我每隔10分钟反复启动此服务,这可以保证如果系统终止服务流程,但会再次启动并且用户不会有任何延迟。
我的问题是下一个:
如何优化所有这些逻辑,而不是耗尽手机电池,而不是 Android操作系统,因为以这种方式耗尽用户的设备电池是荒谬的,但我相信一定有一些好处练习我不得使用firebase或GCM,我不得关闭Socket并尽快打开它,让用户感到巨大的延迟,因为它会分散用户的注意力......
那么任何想法或代码改进?
答案 0 :(得分:0)
您的问题是,由于套接字始终处于打开状态,因此您的应用程序永远不会休眠。的确,您说过您对GCM(FCM)并不感兴趣,但是最好的解决方案可能是同时使用SocketIO和FCM。如前所述,当您的应用程序处于前台时,可以使用SocketIO,因为消息传递更快。当您的应用程序在后台运行时,您会杀死套接字并使用FCM来发送通知,因为该应用程序可以更好地延长电池寿命。