远程服务 - 找不到服务意向 U=0



我有一个套接字服务

清单

<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并在那里执行并停止服务,然后再System.exit(1)2) 奥维利特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我进行了一些测试,结果发现清单中的记录真的消失了,因为我开始向类名添加数字,并且服务开始使用已经新的名称。但是没有找到所有旧名称。

<service
android:name=".SocketService+[1-10]"
android:process=":socket"/>
// Then I put the numbers in reverse order and .SocketService9 useded once already not found.

当服务作为组件被禁用时,唯一有效的选项是手动打开它:

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);
}

最新更新