Android 远程服务的重复实例

Android 远程服务的重复实例,android,sockets,service,Android,Sockets,Service,我有一个奇怪的问题,我正在测试代码的一些android设备上突然出现了这个问题 我正在使用一个由多个活动组成的系统,这些活动共享用于管理整个系统内通信的同一远程服务 问题是,有时在某些设备上,我会得到远程服务的重复实例,这可能不是问题,但确实是一个大问题。事实上,正如我所说的,远程服务用于通过UDP或TCP管理消息交换,当我获得此服务的多个实例时,我会遇到套接字问题,因为这两个服务尝试使用相同的端口(广播端口),导致EADDRINUSE异常 有人能告诉我为什么我会得到这个服务的多个实例吗 下面是

我有一个奇怪的问题,我正在测试代码的一些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
来拥有一个可以从其他应用程序访问的服务。非常感谢!!!!!!你已经解决了一个困扰我很长时间的问题,并导致了整个系统的不良行为。除了经典的啤酒外,我还会请你吃一顿快乐的晚餐;)