Android服务可以不启动绑定吗?

Android服务可以不启动绑定吗?,android,android-service,Android,Android Service,到目前为止,在许多文章、教程和文档中,我们称之为startService()或bindService(),它们都启动服务。我们也可以两者兼而有之,但情况不同。没有startService(),我无法绑定服务 在上面的代码中,如果我注释startService(),bindService将返回false和tunManagerService=null,即使onServiceConnected未启动,我也会收到“无法发送服务意图{…}未找到”消息。添加startService后,将调用服务的onCre

到目前为止,在许多文章、教程和文档中,我们称之为startService()或bindService(),它们都启动服务。我们也可以两者兼而有之,但情况不同。没有startService(),我无法绑定服务

在上面的代码中,如果我注释startService(),bindService将返回false和tunManagerService=null,即使onServiceConnected未启动,我也会收到“无法发送服务意图{…}未找到”消息。添加startService后,将调用服务的onCreate、onStart、OnServiceConnectiond并成功绑定

在实际使用中,是否有必要首先启动Servie&然后只有我们才能使用bindService()。这意味着没有startSErvice,我们就无法绑定服务!!如果这个语句是错误的,为什么我不能在不启动它的情况下绑定服务

有什么想法吗

添加的代码

服务连接:

    private ServiceConnection tunConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG,"onServiceConnected" );
        tunManagerService = ITunnelManagerService.Stub.asInterface(service);
        doConnect();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG,"onServiceDisconnected" );
        tunManagerService = null;
    }

};
public class TunnelManagerService extends Service {
@Override
public IBinder onBind(Intent arg0) {
    return binder;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "TunnelManagerService: onCreate");
    setCreatedPreference(true);
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Received start id " + startId + ": " + intent);
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    setCreatedPreference(false);
    hideNotifConnected();
    Log.d(TAG, "TunnelManagerService: onDestroy");
}

private final ITunnelManagerService.Stub binder = new ITunnelManagerService.Stub() {
  // contains all methods
}

...............
.............
        <activity android:name=".StartUltimate" android:label="@string/app_name" 
         android:launchMode="singleTask" android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name="orange.android.vpn.utilities.TunnelManagerService" android:enabled="true"></service>
服务:

    private ServiceConnection tunConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG,"onServiceConnected" );
        tunManagerService = ITunnelManagerService.Stub.asInterface(service);
        doConnect();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG,"onServiceDisconnected" );
        tunManagerService = null;
    }

};
public class TunnelManagerService extends Service {
@Override
public IBinder onBind(Intent arg0) {
    return binder;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "TunnelManagerService: onCreate");
    setCreatedPreference(true);
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Received start id " + startId + ": " + intent);
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    setCreatedPreference(false);
    hideNotifConnected();
    Log.d(TAG, "TunnelManagerService: onDestroy");
}

private final ITunnelManagerService.Stub binder = new ITunnelManagerService.Stub() {
  // contains all methods
}

...............
.............
        <activity android:name=".StartUltimate" android:label="@string/app_name" 
         android:launchMode="singleTask" android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name="orange.android.vpn.utilities.TunnelManagerService" android:enabled="true"></service>
}

清单:

    private ServiceConnection tunConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG,"onServiceConnected" );
        tunManagerService = ITunnelManagerService.Stub.asInterface(service);
        doConnect();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG,"onServiceDisconnected" );
        tunManagerService = null;
    }

};
public class TunnelManagerService extends Service {
@Override
public IBinder onBind(Intent arg0) {
    return binder;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "TunnelManagerService: onCreate");
    setCreatedPreference(true);
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Received start id " + startId + ": " + intent);
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    setCreatedPreference(false);
    hideNotifConnected();
    Log.d(TAG, "TunnelManagerService: onDestroy");
}

private final ITunnelManagerService.Stub binder = new ITunnelManagerService.Stub() {
  // contains all methods
}

...............
.............
        <activity android:name=".StartUltimate" android:label="@string/app_name" 
         android:launchMode="singleTask" android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name="orange.android.vpn.utilities.TunnelManagerService" android:enabled="true"></service>


我使用2.3.3 SDK,即API 10。我呼叫的活动位于“orange.android.vpn”中,与服务相关的文件分别位于“orange.android.vpn.utilities”包中。

我找到了解决方案,因此我与大家分享

有两种类型的服务:一种是启动和停止服务。在应用程序中只能启动和停止一次。 其他您需要绑定和解除绑定N次。 我的服务属于第二类。但仅仅绑定和解除绑定并不能起作用。首先需要启动服务,然后才能绑定和解除绑定。因此,在应用程序启动时或在适当的情况下,启动服务。然后在需要时绑定。don拿着它时,解开它。那个绑定-解除绑定的循环可以继续。最后,当你确定不需要它时,或者在应用程序结束时停止服务。因此,流量如下所示 开始->绑定->解除绑定->停止 对

好的,这将始终返回true(假设MyService没有问题)

有两种情况:

  • 服务以前已启动-调用McConnection的OnServiceConnection()
  • 该服务以前未启动-未调用McConnection的OnServiceConnection(),且该服务未启动。但是,一旦服务启动(通过其他方式),就会调用onServiceConnected()

  • 实际上,当我调用此方法时,我假设在调用onServiceConnected()方法之前服务不会启动。

    您使用的api级别是什么?在2.1上,我的行为正常。请为您的服务和服务连接发布代码。另外,您是否查看了logcat输出?它是否显示任何错误?如果是这样的话,也在这里发布。可能是重复的?@Jake,不,我找不到那篇文章的副本。我已经添加了服务和服务连接代码。在logcat中,我只收到ActivityManager的“无法启动服务意图{….}未找到”警告。没有其他异常或错误。bindService()如果服务还没有启动,实际上会启动它。@Jason:是的,但是一些关键的事情可能会在服务中的onStart命令中完成。我现在正在使用一个服务,结果发现只有在服务明确启动的情况下才能工作。这也可以解释Tvd的解决方案。这似乎不是答案。您应该能够绑定到服务,而无需显式启动它。如果您还希望在绑定时启动它:bing服务并将标志传递给它Context.bind_AUTO_CREATETo Quote当服务从所有客户端解除绑定时,Android系统将销毁它(除非它也是通过
    onStartCommand()
    启动的)请看,这是一个误导性的答案。只需调用bindService并传递BIND_AUTO_CREATE标志即可启动服务。由于您的回答,我认为服务总是需要在绑定之前启动。但后来我自己尝试了,我可以不用调用startService()来启动服务明确。请修改您的答案,以免误导他人。