首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceConnection.onServiceConnected()和startService()

ServiceConnection.onServiceConnected()和startService()
EN

Stack Overflow用户
提问于 2012-02-10 11:46:18
回答 2查看 10.7K关注 0票数 3

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

代码语言:javascript
复制
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);
        }
    }
}

和一个非常简单的服务:

代码语言:javascript
复制
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():

代码语言:javascript
复制
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():

代码语言:javascript
复制
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()调用:

代码语言:javascript
复制
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()没有被调用?

EN

回答 2

Stack Overflow用户

发布于 2012-02-10 12:05:58

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

票数 3
EN

Stack Overflow用户

发布于 2012-02-10 13:25:32

您只需要在onServiceDisconnected()中解除绑定您的服务。为什么在代码中取消绑定服务之后还要绑定它呢?

不过,如果你想要同样的服务,只需在onServiceDisconnected()中解除绑定你的服务,并通过一个接口通知你的活动你刚刚解除了服务的绑定,一旦你的活动被通知你已经解除了服务的绑定,让它决定是需要绑定它还是not.If它想要再次绑定相同的服务,就让它去做吧。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9222415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档