Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓:绑定服务在被杀死的客户端上能被注意到多少?_Android_Service_Android Activity_Kill - Fatal编程技术网

Android 安卓:绑定服务在被杀死的客户端上能被注意到多少?

Android 安卓:绑定服务在被杀死的客户端上能被注意到多少?,android,service,android-activity,kill,Android,Service,Android Activity,Kill,我有一个活动和服务绑定到它 若服务被系统终止,则会注意到它的活动,因为将调用 但当系统终止活动的进程时,是否有对服务的回调?服务如何知道客户端已被杀死?(不幸的是,当整个进程被终止时,没有onDestroy()方法调用) 我现在看到的唯一方式是: 我的服务中有回调列表: RemoteCallbackList<IModConnClient> mCallbacks RemoteCallbackList mCallbacks 当我通过调用mCallbacks.beginBroadcas

我有一个活动和服务绑定到它

若服务被系统终止,则会注意到它的活动,因为将调用

但当系统终止活动的进程时,是否有对服务的回调?服务如何知道客户端已被杀死?(不幸的是,当整个进程被终止时,没有
onDestroy()
方法调用)

我现在看到的唯一方式是:

我的
服务中有回调列表

RemoteCallbackList<IModConnClient> mCallbacks
RemoteCallbackList mCallbacks
当我通过调用
mCallbacks.beginBroadcast()开始广播时它返回给我许多客户端。所以,我可以记住以前的客户数量,并检查它是否减少了。但这似乎不是一个真正好的解决方案。我想回电话,但不幸的是我找不到

有人能给我一个建议吗?

我找到了解决办法

如中所述,“如果注册回调的进程消失,此类将负责自动将其从列表中删除。如果您想在这种情况下执行其他工作,可以创建一个子类来实现onCallbackDied(E)方法。”

因此,我为
RemoteCallbackList
和interface
iremotecallbacklist
创建了一个子类:

   private interface IRemoteCallbackDied<E extends IInterface> {
      public void remoteCallbackDied(E callback, Object cookie);
   }

   private final class RemoteCallbackListWithDiedCB<E extends IInterface> extends RemoteCallbackList<E> {
      IRemoteCallbackDied<E> mRemoteCallbackDied;

      public RemoteCallbackListWithDiedCB(IRemoteCallbackDied<E> mRemoteCallbackDied)
      {
         this.mRemoteCallbackDied = mRemoteCallbackDied;
      }

      @Override public void onCallbackDied(E callback, Object cookie){
         super.onCallbackDied(callback, cookie);
         this.mRemoteCallbackDied.remoteCallbackDied(callback, cookie);
      }
   }
   private final IRemoteCallbackDied<IModConnClient> mRemoteCallbackDied = new IRemoteCallbackDied<IModConnClient>() {
      public void remoteCallbackDied(IModConnClient mModConnClient, Object cookie)
      {
         Log.v("my_tag", "remote callback died!");
         /*
          * Some code
          */
      }
   };
最后,我的回调列表定义如下:

private RemoteCallbackListWithDiedCB<IModConnClient> mClients = new RemoteCallbackListWithDiedCB<IModConnClient>(mRemoteCallbackDied);
private RemoteCallbackListWithDiedCB mClients=new RemoteCallbackListWithDiedCB(mRemoteCallbackDied);

还有一个简单的解决方案。这是一种服务方式。当一个活动被杀死时,它会让你知道。在文件上。上面写着

公共void onTaskRemoved(Intent rootIntent)

在API级别14中添加 如果服务当前正在运行,并且用户已删除来自服务应用程序的任务,则调用此函数。如果您已使用任务设置ServiceInfo.FLAG\u STOP\u,则不会收到此回调;相反,服务将简单地停止

参数 rootIntent用于启动要删除的任务的原始根意图

如果您想知道在没有onDestroy的情况下整个进程何时被终止,您需要知道。有一个问题


我希望这个答案能在另一方面帮助您:)

为什么您的活动和服务不在同一个过程中?@commonware,这是因为我需要创建一个服务,该服务将使用
AIDL
与其他应用程序通信。我的出发点是这个开发指南:。我在AndroidManifest.xml中为该服务添加了
android:process=“:remote”
。谢谢,但
onTaskRemoved
方法仅在API级别14中添加,但目前我们针对的是API级别为7的设备。谢谢你提供的信息。