Socket.IO 与服务耗尽电池戏剧性(Android)
Posted
技术标签:
【中文标题】Socket.IO 与服务耗尽电池戏剧性(Android)【英文标题】:Socket.IO With Service Draining Battery Dramatically (Android) 【发布时间】:2017-09-11 18:30:39 【问题描述】:美好的一天。
我有一个关于电池管理最佳实践的问题。
事先请不要建议也不要GCM也不要Firebase,因为我对它们不感兴趣,我会在之后告诉原因。
所以这里是场景。
我自己部署了一个社交网络。
我几乎不相信 Viber、WhatsApp 或 Telegram 正在使用任何 Google 服务,例如 GCM 或 Firebase 并且我已经使用了它们,而且我对它们的延迟以及我收到的价格非常不满意,所以对我来说最好的选择是将所有通知隐藏在Socket.IO。
所以现在的每一步:
• 我创建了一个始终运行的服务,它无论如何都在运行。
• 服务附加了 Socket.IO 库,并且服务通过 Socket.IO 与服务器保持持久连接。
• 该服务处理接下来的所有 Socket.IO 逻辑:完整的应用程序通知 - 组通知、好友请求、消息通知以及所有这些,所有这些都包括 10 种类型的通知,可以在我的内部申请。
• 一切都很完美,除非我看到我的三星 S7 Edge 抱怨我的应用程序的使用情况。我虽然这是三星典型的抱怨之一,但当我看到电池使用情况时,我感到震惊......我的应用使用了比 ANDROID 操作系统更多的电池,这对我来说是一个很大的打击。
我将很快向您展示我的服务代码:
我正在像这样初始化套接字。
@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 OS,因为以这种方式消耗用户设备电池是可笑的,但我相信一定有一些好的练习我不能使用 firebase 或 GCM,我不能关闭 Socket 并打开它很晚,让用户感到巨大的延迟,因为它会分散用户对我的应用程序的注意力......
那么有什么想法或代码改进吗?
【问题讨论】:
你能解决这个问题吗? 【参考方案1】:您的问题是您的应用程序永远不会因为套接字始终打开而休眠。您确实说过您对 GCM (FCM) 不感兴趣,但最好的解决方案可能是同时使用 SocketIO 和 FCM。当您的应用程序处于前台时,您使用 SocketIO,因为正如您所解释的,消息传递更快。当您的应用程序处于后台时,您会终止您的套接字并使用 FCM 来传递通知,因为它更优化了电池寿命。
【讨论】:
您好,您在 github 中有示例或 ar repo。我知道 fcm 可以在后台和终止模式下显示通知,但如何整合两者。谢谢以上是关于Socket.IO 与服务耗尽电池戏剧性(Android)的主要内容,如果未能解决你的问题,请参考以下文章