ServiceConnection.onServiceConnected () и startService () - PullRequest
2 голосов
/ 10 февраля 2012

У меня очень простая активность:

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] First stopService ():

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 () и нет onServiceConnected () вызовов:

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 () не вызывают?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

если вы привязываетесь к сервису, сервис onBind будет звонить, поэтому второй startService вызов, без привязки к сервису, вам нужно снова вызвать bindService(serviceIntent, sc, BIND_DEBUG_UNBIND).

2 голосов
/ 10 февраля 2012

вам нужно просто отменить привязку вашего сервиса в onServiceDisconnected (). Почему вы хотите связать свой сервис сразу после того, как вы связали его в своем коде?

Тем не менее, если вы хотите того же, просто отсоедините ваш сервис в onServiceDisconnected () и уведомите вашу активность через интерфейс, что вы только что отменили привязку вашего сервиса, и как только ваше действие получит уведомление о том, что вы удалили сервис, пусть решит, нужно ли ему связывать это или нет. Если он хочет снова связать то же самое, просто позвольте ему это сделать.

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