связанные методы обслуживания доступны в Activity, даже после того, как они не связаны и не остановлены - PullRequest
0 голосов
/ 19 мая 2018

Рассмотрим следующую последовательность:

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

1 Ответ

0 голосов
/ 19 мая 2018

Ограничены и запущены два разных типа Service.Вы можете создать службу, которая будет запущена и связана.То есть вы можете запустить службу, позвонив по номеру startService(), что позволяет службе работать бесконечно, и вы также можете разрешить клиенту привязываться к службе, позвонив по номеру bindService().

.следует: -

 startService > bindService > unbindService > stopService

Это Service запускается Сервисы, которые ограничены Activity.Таким образом, когда Unbind система не останавливает Service, вы должны явно остановить службу, позвонив по номеру stopSelf() или stopService().

PS: - Если Serviceобслуживая некоторую SActivity, сделать ее ограниченной только не нужно вызывать startService, в этом случае Service будет автоматически разрушаться после последней отмены привязки.

Обратите внимание, что если остановленная служба все еще имеет объекты ServiceConnection, связанные с ней с набором BIND_AUTO_CREATE, она не будет уничтожена, пока не будут удалены все эти привязки.См. Сервисную документацию для более подробной информации о жизненном цикле сервиса.

Редактировать: - В вашем случае служба больше не работает после отмены привязки.Вы можете вызвать метод только потому, что у вас есть ссылка Binder, которая не означает, что он работает.Помните, что Service - это Component. Чтобы проверить это, вы можете вызывать метод ниже на каждой стадии.

private boolean isServiceRunning(Class<?> className) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (className.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}



if(isServiceRunning(MyService.class)){
                Log.e("Service","Running");
            }else{
                Log.e("Service","NotRunning");
            }

Официальное определение unbindService () гласит:

Отключение от службы приложения.Вы больше не будете принимать звонки, поскольку служба перезапущена, и теперь службе разрешено останавливаться в любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...