【问题标题】:Android AIDL problem with activity and service活动和服务的Android AIDL问题
【发布时间】:2011-09-02 19:18:29
【问题描述】:

我正在编写一个 Android 2.1 应用程序,当外部事件触发其中一个 GPIO 时,它应该向用户显示一个对话框。我已经编写了 Linux 设备驱动程序,并为它编写了 JNI 用户空间接口。 当我的应用程序启动时,它会启动一个轮询设备驱动程序的远程服务。使用aidl,我设法在活动和服务之间进行通信,但是,当我关闭活动时,我希望服务重新启动活动。 我使用以下代码实现了这一点:(在服务中)

Intent dialogIntent = new Intent(getBaseContext(),WiegandDemoActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);

紧接着,我想用aidl交流,所以我用了:

synchronized (listeners) {
for (WiegandListener listener : listeners) {
    try {
         listener.handleWiegandUpdated();
...

活动被带到前面,但是辅助消息没有到达它。 为什么会这样? (当活动在前面时,一切正常)

我不想在这里发布所有代码,因为它很大,但是如果您需要更多信息,请不要犹豫。

谢谢。

【问题讨论】:

  • 不知道你的RemoteInterface是否还在绑定?也许在服务的 onBind、onRebind 和 onUnbind 方法中添加一些日志记录,看看这是否能说明问题。如果序列以取消绑定结束,那么您没有接口。

标签: android android-service aidl


【解决方案1】:

您需要重新绑定到远程 Activity。让 Activity 在启动时注册到服务是否可行 - 因此当您知道新 Activity 已准备好接收传入消息时触发更新代码?

当您的活动关闭时,请务必取消注册您的事件侦听器 - 否则它会挂起。如果它包含对实际活动的引用,那么整个活动将保留在内存中并且不会收集垃圾(即使它已关闭并且您已经创建了一个新活动)。

【讨论】:

  • 为什么使用weakHashMap(在服务端的侦听器中)不能作为这种内存泄漏的预防措施?
  • 据我所知,没有理由不这样做;您只需要小心考虑其中一个已被垃圾收集的情况(我不知道这里会发生什么,但我想它会抛出一个您可以明智地捕获的异常,然后从您的列表)。
  • 好吧,我认为它有效,但它只会在一段时间后显示存在问题(null,或为 isEnqueued 返回 true),而不仅仅是在活动消失后。例如,即使只有一个活动向服务上的侦听器注册(并且不请求删除侦听器),hashMap 也可能大于 1。可能是因为 GC 后面来了。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多