首页 > 解决方案 > 当所有活动解除绑定时,是否会破坏有界服务?

问题描述

我在 android 有界服务的 onStartCommand() 中创建一个单独的线程,并使用 Runnable 的 Run() 中的条件检查来运行它,例如,当(条件)时,有一个活动正在使用这个有界服务,然后解除它的绑定。我读到有一条规则,如果没有绑定的活动,有界服务会自动销毁。我是否需要在 unbind 方法中翻转我的条件,否则服务将如何知道它现在必须终止?如果是,那么它由我的代码控制,而不是由 Android 本身控制

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;

public class ServiceDemo extends Service {

    private static final String TAG = "ServiceDemo";

    private boolean isRunning = false;
    private boolean isBound = false;
    private int counter = 0;
    private static final int MIN = 0;
    private static final int MAX = 100;

    IBinder myServiceBinder = new MyServiceBinder();

    public class MyServiceBinder extends Binder {
        public ServiceDemo getServiceInstance(){
            return ServiceDemo.this;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        isBound = true;
        return myServiceBinder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand executed in Thread : "+Thread.currentThread().getId());
        isRunning = true;
        generateSequentialInteger(MIN, MAX);
        return START_NOT_STICKY;
    }

    private void generateSequentialInteger(int start, int stop){
       new Thread(new Runnable() {
           @Override
           public void run() {
               counter = start;
               while(isRunning && counter<stop){
                   try {
                       Thread.sleep(500);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   Log.i(TAG, "Thread ID : "+Thread.currentThread().getId()+" : Service has generated number "+counter);
                   counter++;
               }
           }
       }).start();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG, "onUnbind executed");
        isBound = false;
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        isRunning = false;
        Log.i(TAG, "onDestroy executed");
    }
}
'''

标签: androidandroid-serviceandroid-service-binding

解决方案


推荐阅读