使用Android服务的套接字Io

美好的一天.考虑到用于 Android的Socket IO库及其服务,我有一个非常具体的问题.

重要的是,我的设备是我正在测试的huawei p8 lite.

在这里

我有一个套接字Io库,它正在我创建的服务中初始化

•我将侦听器设置为套接字io以获取新消息

•如果应用程序未在用户的进程中被杀死,则所有内容都像char一样工作.

•服务的目的是即使应用程序被终止也要保持套接字IO连接处于活动状态,以便向用户通知新消息.

•一旦应用程序被终止,Socket IO连接就会断开连接

无论我尝试什么,我都会尝试所有可能的方法:隔离服务流程,为服务提供另一个流程,启动它粘性,启动它不会在服务破坏等时重新创建等等.

唯一有效的是startForeground()方法,但我不想使用它,因为它将遵循设计原则,而且我不想显示有关正在运行的服务的任何通知.

我的问题是下一个:任何人都可以帮助我并告诉我如何保持Socket IO连接活着,即使应用程序被杀死了?

这是服务的代码.

package com.github.nkzawa.socketio.androidchat;

import android.app.Notification;
import android.app.notificationmanager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

import java.net.URISyntaxException;

import io.socket.client.IO;
import io.socket.client.socket;
import io.socket.emitter.Emitter;

public class SocketService extends Service {
    private Socket mSocket;
    public static final String TAG = SocketService.class.getSimpleName();

    @Override
    public IBinder onBind(Intent intent) {
        // Todo: Return the communication channel to the service.
        throw null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this,"on created",Toast.LENGTH_SHORT).show();
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        Toast.makeText(this,"start command",Toast.LENGTH_SHORT).show();
        try {
            mSocket = IO.socket(Constants.CHAT_SERVER_URL);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
        mSocket.on("newMessageReceived",onNewMessage);
        mSocket.connect();
        return START_STICKY;
    }

    private Emitter.Listener onNewMessage = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            String message = args[0].toString();
            Log.d(TAG,"call: new message ");
            sendGeneralNotification(getApplicationContext(),"1","new message",message,null);
        }
    };

    private void sendGeneralNotification(Context context,String uniqueId,String title,String contentText,@Nullable Class<?> resultClass) {

        notificationmanager notificationmanagerCompat = (notificationmanager) context.getSystemService(NOTIFICATION_SERVICE);

        android.support.v7.app.NotificationCompat.Builder builder = new android.support.v7.app.NotificationCompat.Builder(context);
        builder.setAutoCancel(true);


        builder.setContentTitle(title);
        builder.setContentText(contentText);
        builder.setGroup("faskfjasfa");
        builder.setDefaults(android.app.Notification.DEFAULT_ALL);
        builder.setStyle(new NotificationCompat.BigTextStyle()
                .setSummaryText(title)
                .setBigContentTitle(title)
                .bigText(contentText)
        );

        Intent requestsViewIntent = new Intent(context,MainActivity.class);
        requestsViewIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        requestsViewIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent requestsViewPending = PendingIntent.getActivity(context,Integer.valueOf(uniqueId),requestsViewIntent,0);
        builder.setContentIntent(requestsViewPending);
        builder.setSmallIcon(R.drawable.ic_launcher);

        builder.setShowWhen(true);
        android.app.Notification notification = builder.build();
        notificationmanagerCompat.notify(Integer.valueOf(uniqueId),notification);
    }

    private Notification getNotification() {
        Notification notification;
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setColor(getResources()
                .getColor(R.color.material_deep_teal_500))
                .setAutoCancel(true);

        notification = builder.build();
        notification.flags = Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_AUTO_CANCEL;

        return notification;
    }
}

不,我不想既不使用firebase也不想使用任何第三方制造的,因为我现在正在使用一个,而且我受到延迟,未收到的通知等等,我将使我自己的小方法更好.感谢大家的时间和耐心.

解决方法

很抱歉,没有人快速回复您的问题.我希望情人节2018不会花在别人的痛苦上.

后台实现Socket.io并不是最好的想法. Socket.io对您的服务器有一个活动的ping.在短时间内使用它是可以的,但在后台它是NO.

解决问题的最佳方法是结合Socket.io和FCM / GCM主题发出广播.在用户设备上,检测是否存在活动的Socket.io连接,如果退出则忽略FCM,否则执行FCM.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...