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

Posted

技术标签:

【中文标题】android服务重新启动时如何处理远程对象?【英文标题】:How to handle remote objects when an android service restarts? 【发布时间】:2012-01-31 09:03:48 【问题描述】:

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

    Android MyService (apk) MyServiceClient (jar) MyApplication(通过 MyServiceClient 使用 MyService)

对于 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】:

听起来与标准 Java 上的 RMI 存在相同的问题。

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

埃德

【讨论】:

以上是关于android服务重新启动时如何处理远程对象?的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification - 应用程序未运行时如何处理?

调试时如何处理 ClassNotLoadedException?

应用未运行时如何处理远程通知

当 UI 允许新对象时如何处理取消

由于内存导致重新分配失败时如何处理?

从最近清除应用程序时如何处理作为前台运行的服务?