【问题标题】:Binding to service that was allready started by BroadcastReceiver creates new instance of service绑定到已由广播接收器启动的服务会创建新的服务实例
【发布时间】:2011-08-26 00:40:38
【问题描述】:

我的应用程序使用由 BOOT_COMPLETE BroadcastReceiver 启动的服务,如下所示:

public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context, MyService.class));
}

如果在我的应用程序的一个活动中,我尝试像这样绑定到这个服务:

getApplicationContext().bindService(new Intent(getApplicationContext(), MyService.class), 
    _serviceConnection, Context.BIND_AUTO_CREATE);

创建了一个新的服务实例,尽管第一个实例(由广播接收器创建)仍在运行。我在服务的 onCreate() 方法和第一个方法中记录了进程 ID 服务在与活动不同的进程中运行,第二个实例是在与活动相同的进程中创建的。我尝试在清单的服务元素中设置一个 android:process 参数(前导:和没有前导),但结果保持不变。

如何绑定到在不同进程中运行的服务,而不是在 Activity 运行的进程中创建新实例?

【问题讨论】:

  • 为什么广播接收器和活动在不同的进程中运行?这是必要的吗?你需要 AIDL 和进程间通信来做你想做的事。
  • @bigstones:广播接收器没有必要在不同的进程中运行。显然,这只是android默认设置的方式。如何让广播接收器和我的主要活动在同一个进程中运行?
  • 默认情况下,它们应该在同一个进程中运行,AFAIK。您可以发布清单吗?
  • @bigstones:我刚刚更改了我的服务的 onBind() 方法以返回一个aidl Binder,而不是我之前使用的 Messenger。不幸的是,结果还是一样。
  • @bigstones: manifest 是 here(稍微混淆了)。

标签: android service process ipc broadcastreceiver


【解决方案1】:

我可以向你保证,它不会。无论您启动或绑定多少次,一次只有一个特定服务组件的实例处于活动状态。此外,该服务将仅在一个进程中运行。它无法在不同的时间在不同的进程中运行。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多