在调用stopService之后,为什么服务仍然存在(似乎是)

时间:2015-09-17 06:05:10

标签: android

我有一个我的应用程序服务,我将它用于Socket.IO。 我不想允许绑定,所以:

/**
 * You must always implement this method, but if you don't want to allow binding
 * then you should return null.
 */
@Override
public IBinder onBind(@NonNull Intent intent) {
    return null;
}


@Override
public int onStartCommand(@NonNull Intent intent, int flags, int startId) {
    return START_NOT_STICKY;
}

我在onCreate()中初始化Socket.IO:

@Override
public void onCreate() {
    super.onCreate();
    mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Log.d(TAG, "Service Create");
    //...More
    setForeground();
    initSocketIO();
}


private void setForeground() {
    Intent notificationIntent = new Intent(this, LiveTabActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    //getNotification() is deprecated in API16
    if (Build.VERSION.SDK_INT >= 16) {
        Notification notification = new Notification.Builder(context)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(getString(R.string.service_running))
                .setSmallIcon(R.drawable.defimgs)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.md1))
                .setContentIntent(pendingIntent).build();
        startForeground(100, notification);
        return;
    }
    Notification notification = new Notification.Builder(context)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(getString(R.string.service_running))
            .setSmallIcon(R.drawable.defimgs)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.md1))
            .setContentIntent(pendingIntent).getNotification();
    startForeground(100, notification);
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "Service onDestroy");
    //...more
}

在initSocketIO()中,我初始化Socket.IO的数据,以便我可以接收服务器的消息。当服务收到消息时,它将有一个日志并推送通知。

之后该应用程序运行良好。但在此应用程序中,我想为用户提供注销其帐户的功能。因此,当用户选择注销此应用程序时应停止服务。

但是当我在Activity中使用stopService()来停止服务时,我可以看到" Service onDestroy"在LogCat但服务还活着! 因为当服务从服务器接收消息时我可以看到登录LogCat!

即使我使用EventBus将事件发送到此服务以使此服务自行调用stopSelf,此问题仍然存在。

那么如何停止以Foreground开头的服务? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

你没有在代码中显示它,但听起来你仍然有一个socketIO的主动监听器。在onDestroy,您需要在先前在off中创建的disconnect上致电SocketinitSocketIO。此外,如果您在服务中自己启动了任何后台线程,则需要确保它们在onDestroy中关闭。

答案 1 :(得分:0)

服务被破坏,但Socket.IO的监听器仍然存在。 记得关闭Socket.IO并关闭后台线程。