Рассмотрим следующую последовательность:
startService > bindService > getRandomNumber > unbindService > stopService > getRandomNumber
В соответствии с моим пониманием, после того, как я отключил службу с активностью, у меня не должно было быть доступа к методам в службе, но я все еще могуполучить доступ к ним после отмены привязки и даже после остановки службы.
Любое объяснение этого поведения?
Я использовал флаг BIND_AUTO_CREATE
, и метод, который все еще доступен, является простым методом генератора случайных чисел, который не зависит ни от какого другого объекта.
Вот моя деятельность:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Intent serviceIntent;
private MyService.MyServiceBinder myServiceBinder;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myServiceBinder = ((MyService.MyServiceBinder) service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.threadUpdate);
serviceIntent = new Intent(this, MyService.class);
}
public void startService(View view) {
startService(serviceIntent);
}
public void stopService(View view) {
stopService(serviceIntent);
}
public void getRandomNumber(View view) {
String str = "Is binder alive :" + myServiceBinder.isBinderAlive()
+ "\n" + "ServiceConnection :" + connection + "\n"
+ "getRandomNum :" + myServiceBinder.getRandomNumber();
textView.setText(str);
}
public void bindService(View view) {
bindService(serviceIntent, connection, BIND_AUTO_CREATE);
}
public void unBindService(View view) {
unbindService(connection);
}
}
Вот мой сервис:
public class MyService extends Service {
private static final String TAG = "FromMyService";
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "Service bound");
return new MyServiceBinder();
}
public class MyServiceBinder extends Binder {
public int getRandomNumber() {
Log.d(TAG, "Service getRandomNumber");
return MyService.this.getRandomNumber();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "Service Started");
return Service.START_STICKY;
}
public int getRandomNumber() {
Log.d(TAG, "Service getRandomNumber");
return (int) (Math.random() * 100);
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
Log.d(TAG, "Service reBound");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "Service unBound");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.d(TAG, "Service Destroyed");
super.onDestroy();
}
}
Вот вывод журнала:
05-19 17:28:29.488 28077-28077/com.thnki.learning D/FromMyService:
Service Started
05-19 17:28:32.230 28077-28077/com.thnki.learning D/FromMyService: Service bound
05-19 17:28:33.966 28077-28077/com.thnki.learning D/FromMyService: Service getRandomNumber
Service getRandomNumber
05-19 17:28:40.094 28077-28077/com.thnki.learning D/FromMyService: Service unBound
05-19 17:28:42.818 28077-28077/com.thnki.learning D/FromMyService: Service Destroyed
05-19 17:28:44.368 28077-28077/com.thnki.learning D/FromMyService: Service getRandomNumber
Service getRandomNumber
05-19 17:28:46.522 28077-28077/com.thnki.learning D/FromMyService: Service getRandomNumber
Service getRandomNumber