Q: Remote Service - Unable to start service Intent U=0 not found У меня есть сервис
Manifest
<service
    android:name=".SocketService"
    android:process=":socket"/>

Я подключаюсь к нему через bindService
и использую AIDL
Сервис предназначен для обмена данными с сервером и приложением. Сервис не имеет интент-фильтров.
public final class SocketService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }
    private final class Binder extends ISocketService.Stub {
        @Override
        public void on(String event, ISocketEmitterListener listener) throws RemoteException {
            ...
        }
        @Override
        public int emit(String event, byte[] bytes) throws RemoteException {
            ...
            return 0;
        }
    }
    @Override
    public boolean onUnbind(Intent intent) {
        boolean stopSelf = DBManager.getBoolean(DBManager.SOCKET_SERVICE_STOP_SELF);
        if (stopSelf) {
            stopSelf();
            DBManager.save(DBManager.SOCKET_SERVICE_STOP_SELF, false);
        }
        Timber.i("SocketService unbinded!");
        return super.onUnbind(intent);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Timber.i("SocketService started!");
        ...
        return START_STICKY;
    }
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        stopSelf();
        Timber.i("SocketService task removed!");
        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        DBManager.save(DBManager.SOCKET_SERVICE_IS_RUNNING, false);
        Timber.i("SocketService destroyed!");
    }
}

Моя проблема в том, что когда приложение получает какую-либо ошибку и вылетает, или просто некорректно закрывается, например выгружается пользователем через диспетчер задач, то следующий запуск службы уже невозможен! Для этого нужно переустановить приложение, иначе пишет это:
ActivityManager: Unable to start service Intent { cmp=package.name/.SocketService} U=0: not found
Как избавиться от этого БЕЗ ПЕРЕУСТАНОВКИ ПРИЛОЖЕНИЯ ?
Я уже перепробовал много способов:
1) Переопределить Thread.UncaughtExceptionHandler и сделать там undind и stopService сервиса перед System.exit(1)
2) Ovveride onTaskRemoved() с stopSelf() внутри
3) Итд...
Сейчас я сделал такой вот метод для проверки, чтобы если что сообщить юзеру, что он должен переустановить приложение из-за этой ошибки.
public static boolean checkOnNonNull(Context context, Class<?> clazz) {
    Intent service = new Intent(context, clazz);
    ResolveInfo rInfo = context.getPackageManager().resolveService(service, PackageManager.GET_SHARED_LIBRARY_FILES);
    ServiceInfo sInfo = rInfo != null ? rInfo.serviceInfo : null;
    if (sInfo == null) {
        Timber.e("Unable to start service " + service + ": not found");
        return false;
    }
    return true;
}

UPD
Я провел некоторые тесты и получается как будто реально пропадает запись из манифеста, потому что я начал прибавлять цифры к названию класса и сервис начинал работать с уже новым именем. Но все старые имена были not found.
<service
    android:name=".SocketService+[1-10]"
    android:process=":socket"/>
// Затем я подставлял цифры в обратном порядке и .SocketService9 будучи использованным один раз уже not found.


A: Едиственным рабочим вариантом когда сервис отключается как компонент оказалось его ручное включение:
public static boolean checkOnNonNull(Context context, Class<?> clazz) {
    Intent service = new Intent(context, clazz);
    ResolveInfo rInfo = context.getPackageManager().resolveService(service, PackageManager.GET_SHARED_LIBRARY_FILES);
    ServiceInfo sInfo = rInfo != null ? rInfo.serviceInfo : null;
    if (sInfo == null) {
        Timber.e("Unable to start service " + service + ": not found");
        return false;
    }
    return true;
}

if (!checkOnNonNull(context, MyServiceClass.class)) {
    ComponentName component = new ComponentName(getPackageName(), MyServiceClass.class.getName());
    getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
}

