2010-09-25 88 views
2

我是一個初學者,他做了一個簡單的程序來展示服務如何工作。爲什麼不調用onServiceConnected?

..... 
toStartService = new Intent(this, SimpleService.class); 
    sc = new ServiceConnection() {    
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(MoreService.this, "SC: Binded", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      Toast.makeText(MoreService.this, "SC: Unbinded", Toast.LENGTH_SHORT).show(); 
     }  
    }; 


    startService.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(MoreService.this, "Starting Service", Toast.LENGTH_SHORT).show(); 
      startService(toStartService);   
     } 
    }); 

    stopService.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      stopService(toStartService); 
     } 
    }); 

    bindService.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if((isBound = bindService(toStartService, sc, BIND_AUTO_CREATE))) { 

      } 
     } 
    }); 

    unbindService.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(isBound) { 
       unbindService(sc); 
       isBound = false; 
      } 
     } 
    }); 

} 

爲什麼沒有通過sc變量(在bindService())上調用sc.onServiceConnected()方法? 代碼有什麼問題?

我遇到了這個以下條件:

  • 當我按下[startService]的 服務就開始了,然後 [stopService]服務採空井。

  • 當我按[startService]然後[bindService]什麼也不做,[unbindService]都沒有。

  • 當我按[bindService],它創建了服務,[stopService]沒有工作。我按[unbindService]該服務正在調用onDestroy()方法。

爲什麼bindbin創建的服務在unbinded時被銷燬?我嘗試用startService啓動服務,但無法綁定。

阿瑞幫助我,對不起,如果我錯了。

+0

我有完全相同的問題。現在我明白了爲什麼很多人討厭Java ...... 無論如何,當你說「代碼有什麼問題」時要非常小心,因爲在這個網站上有數百萬假裝「態度警察」,除了回答投票問題像你的。 – 2013-03-16 22:43:24

回答

2

這是所有這些方法的設計行爲。例如,在根據the documentationbindService(Intent service, ServiceConnection conn, int flags)方法,服務將僅只要主叫上下文存在運行:

該服務將被認爲是本系統只只要調用上下文存在需要。例如,如果此Context是一個已停止的Activity,則該服務將不需要繼續運行,直到活動恢復。

對於unbindService (ServiceConnection conn)的文件說:從應用服務

斷開。隨着服務重新啓動,您將不再接收呼叫,現在可以隨時停止服務。

startService (Intent service) documentation它說:

使用startService()覆蓋了由bindService(Intent, ServiceConnection, int)管理默認的使用壽命:它要求服務保持運行,直到stopService(Intent)叫,不管任何的客戶端是否連接到它。請注意,撥打startService()的呼叫不是嵌套:無論您撥打startService()多少次,只需致電stopService(Intent)即可停止。

+0

謝謝,「只要調用上下文存在,服務就會運行」,那麼我如何綁定到已經運行的服務? – 2010-09-25 04:00:33

+0

如果服務是由'startService'啓動的,那麼您可以綁定到它,並且在解除綁定後它將保持運行,但如果它是由'bindService'啓動的,那麼只要調用上下文存在,它就會保持運行。 – Brian 2010-09-25 04:06:25

+0

噢,我只是在服務的onBind方法中插入mBinder,然後ServiceConnection正在工作!爲什麼它可以是這樣的? – 2010-09-25 06:27:25