Android Service可以无需启动即可绑定?

时间:2011-04-28 13:27:28

标签: android android-service

在许多文章,教程,文档,到目前为止,我们调用startService()或bindService(),都启动了服务。我们也可以同时打电话,但这是一个不同的故事。没有startService()我无法bindService。

    private void bindTunManagerService(int flags) {
    TunnelManagerService.setParentActivity(this);
    Intent bindIntent = new Intent(this, TunnelManagerService.class);
    startService(bindIntent);
    tunManagerServiceStarted = bindService(bindIntent, tunConnection, BIND_AUTO_CREATE);

    Log.d(TAG, "tunManagerServiceStarted  : " + tunManagerServiceStarted + ", ** tunManagerService = " + tunManagerService );

在上面的代码中,如果我注释startService(),bindService返回false并且tunManagerService = null,即使onServiceConnected没有被激发,我得到“无法sart service intent {...} not found”消息。添加startService后,将调用服务的onCreate,onStart,onServiceConnected并成功绑定。

在实际使用中,首先启动服务是否必要?那么只有我们可以bindService()。这意味着没有startSErvice,我们就无法bindService !!如果这个语句错了,为什么我不能在没有启动的情况下bindService?

任何想法????

已添加代码

ServiceConnection:

    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”包。

2 个答案:

答案 0 :(得分:10)

我找到了解决方案,所以与大家分享。

有两种类型的服务:一种是你开始和停止的。这只能在应用程序中启动和停止一次。 其他你根据需要绑定和取消绑定N次。 我的服务属于第二类。但只是绑定和解除绑定不起作用。首先需要启动服务,然后才能绑定和解绑。因此,在应用程序启动或适当的时候,启动服务。然后在需要时绑定。戴上它时,解开它。 Bind-Unbind圈可以继续。最后当您确定不需要它或在应用程序结束时停止服务。所以流程来了 开始 - &gt;绑定 - &gt;解开 - &gt;停止              &lt; -

希望这有助于某人。

答案 1 :(得分:4)

bindService(new Intent(this, MyService.class), mConnection, 0);

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

有两种情况:

  1. 此服务先前已启动 - mConnection的onServiceConnected()被称为
  2. 以前没有启动过该服务 - 未调用mConnection的onServiceConnected()且未启动该服务。但是,只要服务启动(通过其他方式),就会调用onServiceConnected()
  3. 实际上,当我调用此方法时,我假设在调用onServiceConnected()方法之前不会启动该服务。