Android 远程服务的重复实例
我有一个奇怪的问题,我正在测试代码的一些android设备上突然出现了这个问题 我正在使用一个由多个活动组成的系统,这些活动共享用于管理整个系统内通信的同一远程服务 问题是,有时在某些设备上,我会得到远程服务的重复实例,这可能不是问题,但确实是一个大问题。事实上,正如我所说的,远程服务用于通过UDP或TCP管理消息交换,当我获得此服务的多个实例时,我会遇到套接字问题,因为这两个服务尝试使用相同的端口(广播端口),导致EADDRINUSE异常 有人能告诉我为什么我会得到这个服务的多个实例吗 下面是我在主活动中设置远程服务绑定的代码,该绑定由我的所有活动继承:Android 远程服务的重复实例,android,sockets,service,Android,Sockets,Service,我有一个奇怪的问题,我正在测试代码的一些android设备上突然出现了这个问题 我正在使用一个由多个活动组成的系统,这些活动共享用于管理整个系统内通信的同一远程服务 问题是,有时在某些设备上,我会得到远程服务的重复实例,这可能不是问题,但确实是一个大问题。事实上,正如我所说的,远程服务用于通过UDP或TCP管理消息交换,当我获得此服务的多个实例时,我会遇到套接字问题,因为这两个服务尝试使用相同的端口(广播端口),导致EADDRINUSE异常 有人能告诉我为什么我会得到这个服务的多个实例吗 下面是
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(
MyAction.REMOTE_SERVICE_LOAD));
getApplicationContext().bindService(
new Intent(IRemoteService.class.getName()), mConnection,
Context.BIND_AUTO_CREATE);
}
/** The primary interface we will be calling on the service. */
private IRemoteService mService = null;
private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(final ComponentName className,
final IBinder service) {
mService = IRemoteService.Stub.asInterface(service);
try {
mService.registerCallback(mCallback);
launchTask();
} catch (final Throwable e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
if (mConnection != null && mService != null) {
mService.unregisterCallback(mCallback);
getApplicationContext().unbindService(mConnection);
Log.d(tag, "UNREGISTER SERVICE CALLBACK for activity "
+ getClass().getSimpleName());
}
} catch (final Exception e) {
e.printStackTrace();
}
}
//method that will be called when I get a notification on serverUp and i come from
//a serverDown situation
public void notifyConnectionUp() {
if (!serverConnected) {
if (mConnection != null) {
try {
mService.unregisterCallback(mCallback);
} catch (final RemoteException e) {
e.printStackTrace();
}
getApplicationContext().unbindService(mConnection);
}
getApplicationContext().bindService(
new Intent(IRemoteService.class.getName()), mConnection,
Context.BIND_AUTO_CREATE);
System.gc();
}
}
我的远程服务中的代码如下:
@Override
public int onStartCommand(final Intent intent, final int flags,
final int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(final Intent intent) {
if (IRemoteService.class.getName().equals(intent.getAction())) {
return mBinder;
}
return null;
}
@Override
public void onCreate() {
Log.d(tag, "onCreate...RemoteService");
//Here I have the registration of some receivers and the launch of other services
}
@Override
public void onDestroy() {
mCallbacks.kill();
}
根据Commonware的要求,这是我的服务应用程序上的标签:
<service
android:name="shared.RemoteService"
android:enabled="true"
android:process=":remote">
<intent-filter>
<action
android:name="shared.IRemoteService"/>
<action
android:name="shared.REMOTE_SERVICE"/>
</intent-filter>
</service>
另一个问题是,当我启动一个新活动时,我总是看到对服务的onStartCommand方法的调用,这是否正确?我希望调用服务的onBind()方法(考虑到在main活动中,我先调用startService(),然后再调用bindService)
我看到我的远程服务有多个实例,因为当我在设备上运行PS命令时,会得到以下结果:
D/Command(14049):ID:1,u0_a67 14013 2330 478116 28620 ffffffffff40767ce8 R服务。net:remote
D/Command(14049):ID:1,u0_a67 31493 14013 477100 21416 00000000 40051a58 R服务。net:remote
如您所见,一个服务似乎是另一个服务的父服务(第二个服务PPID是14013,它是第一个服务PID)
我希望我已经讲清楚了。我相信您看到的是第二个进程,由
android:process=“:remote”
提供,包含您的远程服务,并且您只有一个远程服务实例
您可以考虑删除<代码> Android:进程=“:远程”<代码>,这两个都临时运行一个测试并确认这个理论,并且永久地(除非有一个明确的原因,为什么您需要消耗更多的用户的RAM)。< /P>请发布清单的<代码> <代码>元素。此外,请使用比
ps
更好的测试来确定您的服务是否有多个实例,例如服务代码中的Log
语句。您已经演示了您拥有多个流程,这与拥有多个服务实例不同。在我发布的代码中,我删除了log语句,但我的代码中充满了log。不幸的是,对于logcat,我看不到第二个服务的实例化。有一个问题,删除:远程定义将允许不同的活动绑定到同一个服务(或者唯一的区别是服务在一个单独的进程中运行)?我认为这个定义对于不同活动共享一个服务实例是必要的。无论如何,我会尝试你的建议。@axlcorder:“我认为这个定义对于让不同的活动共享一个服务实例是必要的。”--不,你不需要android:process
来拥有一个可以从其他应用程序访问的服务。非常感谢!!!!!!你已经解决了一个困扰我很长时间的问题,并导致了整个系统的不良行为。除了经典的啤酒外,我还会请你吃一顿快乐的晚餐;)