android服务重启时如何处理远程对象?

时间:2012-01-31 09:03:48

标签: android service ipc remoteobject

我在Android中创建了以下实体: -

  1. Android MyService(apk)
  2. MyServiceClient(jar)
  3. MyApplication(通过MyServiceClient使用MyService)
  4. 对于IPC,我使用过AIDL。下面给出了(服务客户端)的示例实现。

    AIDL接口 - ICLAZZ.aidl(在服务端实现,内部用于IPC服务) 服务客户端 - CLAZZ.java(面向开发人员的API)

    ICLAZZ.aidl

    interface ICLAZZ {
     void doSomething();
    }
    

    CLAZZ.java

    public class CLAZZ 
    {
      private ICLAZZ mSvcInstance; //remote object
    
    
      // static method, instead of constructor for object creation due to some reason
    
    
      public static synchronized CLAZZ getInstance(inputParam) 
      {
      // ICLAZZ remoteObject = get the remote object from service
    
      if(remoteObject!=null) {
        INSTANCE = new INSTANCE(inputParam);
        INSTANCE.mSvcInstance = remoteObject;
       }
    
       return INSTANCE;
    
      }
    
      private CLAZZ() {
      }
    
    
      private CLAZZ(inputParam) {
       // initialize based on inputParam
      }
    
      public void doSomething() {
       if(mSvcInstance!=null)
         mSvcInstance.doSomething();
      }
    };
    

    当API用户调用CLAZZ.getInstance()时,我创建一个远程对象实例并将其保存在CLAZZ的本地对象中,并将CLAZZ对象返回给用户。

    我面临的问题是,如果服务重新启动,所有以前的远程对象都会失效。但是,API用户可能已保存先前创建的CLAZZ对象,并且可能希望在其上调用某些功能。这将导致应用程序失败。此外,我不想保留应用程序创建的任何全局API对象列表。在给定的场景中,是否有一些机制可以通过它来优雅地处理这种情况并为现有对象提供恢复。

1 个答案:

答案 0 :(得分:0)

听起来与标准Java上的RMI相同。

当远程对象失败时,只需从服务中获取一个新的远程对象(在Android上绑定)。