4

再会。

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

事先请不要建议GCM也不要建议Firebase,因为我对它们不感兴趣,我会在之后告诉原因。

所以这里是场景。

我自己部署了一个社交网络。

我几乎不相信ViberWhatsAppTelegram正在使用GCMFirebase等任何 Google 服务,而且我已经使用了它们,而且我对它们的延迟以及我收到的定价非常不满意,所以对我来说这是最好的选择是将所有通知保存在 Socket.IO 的引擎盖下。

所以现在的每一步:

• 我创建了一个始终运行的服务,无论如何它都在运行。

• 服务附加了 Socket.IO 库,并且服务通过 Socket.IO 保持与服务器的持久连接。

• 该服务处理所有 Socket.IO 逻辑,接下来是:完整的应用程序通知 - 组通知、好友请求、消息通知以及所有这些通知,我的应用程序中大约有 10 种通知类型。

• 一切都很完美,除非我看到我的三星 S7 Edge 抱怨我的应用程序的使用情况。我虽然这是三星典型的抱怨之一,但当我看到电池使用情况时,我感到震惊......我的应用程序使用的电池比安卓操作系统多,这对我来说是一个很大的打击。

我将很快向您展示我的服务代码:

我正在像这样初始化套接字。

@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 和我不能关闭套接字并打开它很晚,让用户感到巨大的延迟,因为它会分散用户对我的应用程序的注意力......

那么有什么想法或代码改进吗?

4

1 回答 1

2

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

于 2019-10-18T09:56:45.323 回答