Android 检查服务的状态失败,因为类加载器

Android 检查服务的状态失败,因为类加载器,android,android-activity,android-service,aidl,Android,Android Activity,Android Service,Aidl,我有一个活动启动了一个非本地的服务。有时,我会检查是否还活着以执行操作 我当时的尝试是使用一个静态布尔变量。在网上读了一些帖子,我发现这不管用,因为 做这样一个简单的任务是昂贵的 其他解决方案指出使用AIDL。在不久的将来,在我的服务中,我将为当前正在运行的活动存储一个WeakReference,以便在崩溃时再次执行它。假设现在我只想检查服务的状态,这也是一个昂贵的解决方案吗 注:我知道不正确处理异常是一个丑陋的解决方案。这只是一次尝试 编辑:为了澄清我在做什么,我发布了一些代码。这是服务类别:

我有一个活动启动了一个非本地的服务。有时,我会检查是否还活着以执行操作

我当时的尝试是使用一个静态布尔变量。在网上读了一些帖子,我发现这不管用,因为

做这样一个简单的任务是昂贵的

其他解决方案指出使用AIDL。在不久的将来,在我的服务中,我将为当前正在运行的活动存储一个WeakReference,以便在崩溃时再次执行它。假设现在我只想检查服务的状态,这也是一个昂贵的解决方案吗

注:我知道不正确处理异常是一个丑陋的解决方案。这只是一次尝试

编辑:为了澄清我在做什么,我发布了一些代码。这是服务类别:

public class CrashRecover extends Service {

private volatile boolean stop = false;
private Thread backgroundThread;
private Messenger serviceMessenger = null;
private static boolean running = false;

...

@Override
public int onStartCommand(Intent intent, int flags, int startID){
    serviceMessenger = new Messenger(new ServiceHandler(serviceLooper));
    return START_STICKY;
}

@Override
public void onCreate(){
    super.onCreate();
    HandlerThread handlerThread = new HandlerThread("CrashRecoverThread", Process.THREAD_PRIORITY_BACKGROUND);
    handlerThread.start();

    serviceLooper = handlerThread.getLooper();
    backgroundThread = new Thread(){
        @Override
        public void run(){
            synchronized(this){
                try {
                    while(!stop){
                        sleep(500);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }                   
            }
        }
    };
    running = true;
}

@Override
public void onDestroy(){
    super.onDestroy();
    try {
        Message destroyMessage = Message.obtain();
        destroyMessage.arg1 = CrashRecover.DESTROY_SERVICE;
        serviceMessenger.send(destroyMessage);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
    running = false;
}

@Override
public IBinder onBind(Intent arg0) {
    return serviceMessenger.getBinder();
}

public static boolean isRunning(){
    return CrashRecover.running;
}

...

private class ServiceHandler extends Handler{
    public ServiceHandler(Looper looper){
        super(looper);
    }

    @Override
    public void handleMessage(Message message){
        switch(message.what){
            case REGISTER_CLIENT:
                //addActivityToRespawn(null);
                //respawnActivity();
                Log.i("INFO", "Service is registered");
                break;
            case UNREGISTER_CLIENT:
                activityParams = message.getData();
                //respawnActivity();
                if(backgroundThread.isAlive()){
                    stop = true;
                }
                Log.i("INFO", "Service is unregistered");
                break;
            case DESTROY_SERVICE:
                Log.i("INFO", "Service is destroyed");
                break;
            default:
                super.handleMessage(message);
        }
    }
}
}

这是我在验证服务是否正在运行时的类:

public class Main extends Activity {
private Button serviceButton, crashButton;
private Intent serviceIntent;
private ClientMessageHandler clientHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    clientHandler = new ClientMessageHandler();
    serviceIntent = new Intent(Main.this, CrashRecover.class);
    startService(serviceIntent);
}

...

@Override
public void onBackPressed(){
    if(CrashRecover.isRunning()){
        Log.i("INFO", "Service is running");
            //Execute some actions
    }
}
...

}

如果您不经常这样做,那么我建议使用“迭代运行服务”方法。在你的手机上运行的服务不应该太多,对它们进行迭代只能访问Android保留的一些内部数据结构。应该很好。

你想完成什么?您想知道服务是否正在运行吗?还是要确保服务正在运行,以便您可以为其提供一些操作?如果你想使用这项服务,你是如何与之沟通的?请发布一些代码好的,我更新我的帖子来澄清。明白。在我的情况下,我的应用程序的每个新活动都将验证服务是否可以使用。之后,数据将不时地发送到服务中,比如说每5秒发送一次。循环方法不是很有效。而且艾德尔太有用了。我想我没有很多选择,艾德尔也许是解决这个问题的办法。你同意还是不同意?好吧,你可以在每次想使用服务时调用
startService()
。如果它没有运行,Android将启动它。如果它已经在运行,Android将通过调用
onStartCommand()
将意图传递给正在运行的服务。也许你不需要关心它是否在运行。如果您确实需要知道它是否正在运行,则可以绑定到该服务。如果您绑定到该服务,并且该服务死亡/崩溃或关闭,您将收到一个回调
onServiceDisconnected()
。这些是您的其他选择。我已经绑定到该服务,并且正在使用Messenger交换消息。我关心服务的实时性,以保证向其发送数据。还有一个关于onServiceDisconnected()的问题,如果我已从服务断开连接,该服务将不会发送有关您死亡的警告消息(假设它已死亡),因为连接已断开。我插入了一个静态方法isRunning来保证这一点。但因为它们有自己的类加载器,我无法知道它是否还活着。是的,我理解。但如果它没有运行,然后你绑定到它,Android会为你启动它。我看不出到底是什么问题。我想我还不够清楚。很抱歉甚至绑定到服务。我想在每次发送数据之前验证它是否处于活动状态。就这个。