Во многих статьях, руководствах и документах до сих пор читалось, что мы вызываем startService () или bindService (), обе запускают службу. Мы можем также назвать оба, но это другая история. Я не могу bindService без startService ().
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 не запускается, и я получаю сообщение «Невозможно передать намерение службы {...} не найдено». После добавления startService сервисы onCreate, onStart, onServiceConnected вызываются и успешно ограничиваются.
При практическом использовании необходимо сначала запуститьServie, а затем только мы можем bindService (). Это означает, что без startSErvice мы не сможем привязать сервис !! Если это утверждение неверно, почему я не могу 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" соответственно.