Android服务可以不启动绑定吗?
到目前为止,在许多文章、教程和文档中,我们称之为startService()或bindService(),它们都启动服务。我们也可以两者兼而有之,但情况不同。没有startService(),我无法绑定服务 在上面的代码中,如果我注释startService(),bindService将返回false和tunManagerService=null,即使onServiceConnected未启动,我也会收到“无法发送服务意图{…}未找到”消息。添加startService后,将调用服务的onCreate、onStart、OnServiceConnectiond并成功绑定 在实际使用中,是否有必要首先启动Servie&然后只有我们才能使用bindService()。这意味着没有startSErvice,我们就无法绑定服务!!如果这个语句是错误的,为什么我不能在不启动它的情况下绑定服务 有什么想法吗 添加的代码 服务连接:Android服务可以不启动绑定吗?,android,android-service,Android,Android Service,到目前为止,在许多文章、教程和文档中,我们称之为startService()或bindService(),它们都启动服务。我们也可以两者兼而有之,但情况不同。没有startService(),我无法绑定服务 在上面的代码中,如果我注释startService(),bindService将返回false和tunManagerService=null,即使onServiceConnected未启动,我也会收到“无法发送服务意图{…}未找到”消息。添加startService后,将调用服务的onCre
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没有问题) 有两种情况:
实际上,当我调用此方法时,我假设在调用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()来启动服务明确。请修改您的答案,以免误导他人。