美好的一天.考虑到用于
Android的Socket IO库及其服务,我有一个非常具体的问题.
重要的是,我的设备是我正在测试的huawei p8 lite.
在这里:
•如果应用程序未在用户的进程中被杀死,则所有内容都像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也不想使用任何第三方制造的,因为我现在正在使用一个,而且我受到延迟,未收到的通知等等,我将使我自己的小方法更好.感谢大家的时间和耐心.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。