我有一个非常简单的活动:

public class MainActivity extends Activity
{
    private Intent      serviceIntent;
    public  MainService mainService;

    public ServiceConnection sc = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            mainService = ((MainService.MainServiceBinder)service).getService();
            Log.v("xxx", "[MainActivity]: onServiceConnected()");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0)
        {
            mainService = null;
            Log.v("xxx", "[MainActivity]: onServiceDisconnected()");
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        serviceIntent = new Intent(this, MainService.class);
    }

    @Override
    public void osStart()
    {
        super.onStart();
        // To call onServiceConnected() if the service already started
        bindService(serviceIntent, sc, BIND_DEBUG_UNBIND)
    }

    @Override
    public void onStop()
    {
        unbindService(sc);
        super.onStop();
    }

    // android:onClick procedure for Button in layout/main.xml
    public void doStartStopService(View Sender)
    {
        if(null == mainService)
        {
            startService(serviceIntent);
        }
        else
        {
            stopService(serviceIntent);
        }
    }
}

一个非常简单的服务:
public class MainService extends Service implements Runnable
{
    private boolean isInterrupted = false;
    private Thread  thread;

    class MainServiceBinder extends Binder
    {
        MainService getService()
        {
            return MainService.this;
        }
    }

    @Override
    public void onCreate()
    {
        Log.v("xxx", "[MainService]: onCreate()");
        super.onCreate();
        thread = new Thread(this);
        thread.start();
    }

    // 1.6 only
    @Override
    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        Log.v("xxx", "[MainService]: onStart()");
    }

    @Override
    public void onDestroy()
    {
        Log.v("xxx", "[MainService]: onDestroy()");
        if(thread.isAlive())
        {
            isInterrupted = true;
        }
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        Log.v("xxx", "[MainService]: onBind()");
        return new MainServiceBinder();
    }

    @Override
    public boolean onUnbind(Intent intent)
    {
        Log.v("xxx", "[MainService]: onUnbind()");
        return true;
    }

    @Override
    public void run()
    {
        Log.v("xxx", "[MainService]: run() started");

        while(!isInterrupted)
        {
            // ...
        }

        Log.v("xxx", "[MainService]: run() exiting");
    }

}

当我在一个周期内调用doStartStopService()时,我得到了下一个日志:
[1]First StartService():
02-10 07:31:49.775: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:49.975: V/xxx(16306): [MainService]: onBind()
02-10 07:31:50.005: V/xxx(16306): [MainService]: onStart()
02-10 07:31:50.165: V/xxx(16306): [MainActivity]: onServiceConnected()
02-10 07:31:50.175: V/xxx(16306): [MainService]: run() started

[2]第一次停止服务():
02-10 07:31:52.205: V/xxx(16306): [MainActivity]: onServiceDisconnected()
02-10 07:31:52.205: V/xxx(16306): [MainService]: onUnbind()
02-10 07:31:52.215: V/xxx(16306): [MainService]: onDestroy()
02-10 07:31:52.235: V/xxx(16306): [MainService]: run() exiting

[3]第二个startService()-没有onBind()和onServiceConnect()调用:
02-10 07:31:54.355: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:54.365: V/xxx(16306): [MainService]: onStart()
02-10 07:31:54.365: V/xxx(16306): [MainService]: run() started

为什么当我调用startService()秒一次时,函数onBind()和onServiceConnected()没有调用?

最佳答案

如果绑定到服务,则服务onBind将调用,因此第二个startService调用(不绑定到此服务)需要再次调用bindService(serviceIntent, sc, BIND_DEBUG_UNBIND)

07-26 07:41