startService()로 시작한 다음 bindService()로 바인딩하는 원격 서비스가 있습니다. 사용자가 스 와이프로 액티비티를 닫더라도 앱이 명시 적으로 앱을 중지 할 때까지 서비스가 백그라운드에서 실행되기를 원하므로이 작업을 수행합니다. 내가 디버거에서이 프로그램을 실행할 때시작된 서비스에 바인딩
<service
android:name=".TrackService"
android:process=":track_service_process"
android:stopWithTask="false"
android:label="@string/track_service_label"
android:exported="false"
android:enabled="true">
<intent-filter>
<action android:name="com.mydomain.gpslogger.TrackService" />
</intent-filter>
</service>
: 여기
public class TrackService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand","got to onStartCommand");
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.i("onBind", "got to onBind");
return trackServiceBinder;
}
}
활동한다 : 여기
public class GPSLoggerActivity extends Activity implements ServiceConnection {
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(TrackService.class.getName());
intent.setClass(getApplicationContext(), TrackService.class);
startService(intent);
Log.i("onStart", "started TrackService");
if (!getApplicationContext().bindService(intent, this, 0)) {
// close the Activity
}
Log.i("onStart", "bound to TrackService");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("onServiceConnected", "got here");
// get and use the interface from the Binder
}
}
이 서비스의 매니페스트입니다 여기에 서비스의 관련 부분은 startService() 및 bindService()를 통해 단계별로 모든 것이 좋습니다. 서비스 내에서 onStartCommand()가 호출 된 다음 onBind()가 호출되고 Activity에서 onServiceConnected()가 Binder와 함께 호출됩니다. 그러나 디버깅하지 않을 때 어떤 이유로 서비스의 onBind() 메서드가의 onStartCommand() 메서드보다 먼저
이 호출됩니다. 로그의 결과는 다음과 같습니다. 11-28 23:17:01.805: I/onStart(1103): started TrackService
11-28 23:17:01.815: I/onStart(1103): bound to TrackService
11-28 23:17:01.985: I/onBind(1165): got to onBind
11-28 23:17:01.995: I/onStartCommand(1165): got to onStartCommand
Activity의 onServiceConnected() 메소드는 절대로 호출되지 않습니다. bindService() 호출에서 BIND_AUTO_CREATE를 사용해 보았습니다. 효과가 없습니다. 나는 여기에 어떤 종류의 경쟁 조건이 있다고 분명히 말하고 있지만, 나는 이것을 아마도 20 번 실행했고 항상 같은 순서로 나온다. 서비스에서 올바른 호출 순서를 적용하기 위해 생각할 수있는 유일한 방법은 Activity에 BroadcastReceiver를 넣고 서비스의 onStartCommand() 메소드에서 Intent를 보내어 Activity가 bindService()를 호출 할 시간임을 알리는 것입니다). 꽤 괴롭 히는데 ... 더 좋은 방법이 있을까요? 아니면 부재중 전화가 원인이되는 무언가가 있습니까?
서비스가 다른 프로세스로 실행되고 있습니다 ... android : exported = "true"를 사용하여 시도해 보셨습니까? –
영향을주지 않습니다. 내 보낸 속성이 다른 앱이 서비스를 볼 수있게 해준다고 생각합니다. 비록 다른 앱이지만 동일한 앱입니다. 질문에서 제안한 kludge fix를 구현했으며 작동합니다. 아직도 더 우아한 해결책이 있어야하는 것처럼 보인다. –