Socket.IO,电池电量急剧耗尽(Android)

Socket.IO,电池电量急剧耗尽(Android),android,sockets,socket.io,battery,batterymanager,Android,Sockets,Socket.io,Battery,Batterymanager,你好 考虑到电池管理的最佳实践,我有一个问题 事先请不要建议或GCM或Firebase,因为我对它们不感兴趣,我会在以后告诉你原因 下面是一个场景 我有自己的社交网络 我几乎不相信Viber,WhatsApp或Telegram正在使用任何一种谷歌服务,如GCM或Firebase,另外,我已经使用了这两种服务,我对它们的延迟和我收到的价格非常不满,因此对我来说,最好的选择是将所有通知都保存在插座的罩。IO 因此,现在每一步: •我创建了一个始终运行的服务,无论发生什么情况,该服务都在运行 •该服务

你好

考虑到电池管理的最佳实践,我有一个问题

事先请不要建议或GCMFirebase,因为我对它们不感兴趣,我会在以后告诉你原因

下面是一个场景

我有自己的社交网络

我几乎不相信Viber,WhatsAppTelegram正在使用任何一种谷歌服务,如GCMFirebase,另外,我已经使用了这两种服务,我对它们的延迟和我收到的价格非常不满,因此对我来说,最好的选择是将所有通知都保存在插座的罩。IO

因此,现在每一步:

•我创建了一个始终运行的服务,无论发生什么情况,该服务都在运行

•该服务连接了Socket.IO lib,该服务通过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();
}
在调用sevice的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,我不能关闭插座并很晚打开它,让用户感觉到巨大的延迟,因为这会分散用户对我的应用程序的注意力


所以,有什么想法或代码改进吗?

你的问题是,你的应用程序永远不会休眠,因为套接字总是打开的。您确实说过您对GCM(FCM)不感兴趣,但最好的解决方案可能是同时使用SocketIO和FCM。正如您所解释的,当应用程序位于前台时,您可以使用SocketIO,因为消息传递更快。当你的应用程序在后台时,你会关闭你的套接字并使用FCM发送通知,因为它更能优化电池寿命。

你能解决这个问题吗?嗨,你在github中有和示例或ar repo。我知道fcm可以在后台和终止模式下显示通知,但如何将两者集成。谢谢