若是想調用服務中的方法, 經過startService()是作不到的, 這時須要用bindService來解決.ide
下面的demo是在Activity中調用Service中的自定義方法---methodInServicethis
這個demo能夠解決在項目開發中調用service裏的數據。spa
這裏在service中使用到了代理模式。這是爲了,給service組件和activity組件中間添加一箇中間人。代理
經過代理來傳遞數據。也就是binder對象。這個代理就是接口IServicecode
Service中的代碼以下:對象
1 public class DemoService extends Service { 2 3 /** 4 * 內部的小蜜,能夠調用服務內部的方法 5 * 將小蜜私有了,建一個接口,提供對外訪問的方法 6 */ 7 private class Xiaomi extends Binder implements IService{ 8 //經過這個方法調用服務中的方法 9 //重寫接口中的抽象方法 10 public void callMethodInService(int money){ 11 if(money > 100){ 12 //這裏調用了服務裏的方法 13 methodInService(); 14 }else{ 15 System.out.println("這點錢還想辦事啊?"); 16 } 17 } 18 19 public void 洗桑拿(){ 20 System.out.println("一塊兒洗桑拿"); 21 } 22 } 23 24 /** 25 * 在執行bindService時調用該方法 26 * IBinder至關於內部的小蜜 27 */ 28 @Override 29 public IBinder onBind(Intent intent) { 30 System.out.println("2,服務若是成功綁定,會執行onBind方法,返回IBinder小蜜"); 31 return new Xiaomi(); 32 } 33 34 @Override 35 public void onCreate() { 36 System.out.println("服務已經開啓了"); 37 38 } 39 40 @Override 41 public void onDestroy() { 42 System.out.println("服務已經關閉了"); 43 super.onDestroy(); 44 } 45 46 /** 47 * 服務中的方法 48 */ 49 public void methodInService(){ 50 System.out.println("6,你成功調用了服務中的方法"); 51 } 52 53 }
IService接口代碼以下:blog
1 public interface IService { 2 3 public void callMethodInService(int money); 4 5 }
Activity中的代碼以下:接口
1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 } 8 9 MyConn conn; 10 //建立接口的對象 11 IService myBinder; 12 13 //綁定服務 14 public void bindService(View view) { 15 System.out.println("1,綁定服務"); 16 Intent intent = new Intent(this, DemoService.class); 17 conn = new MyConn(); 18 bindService(intent, conn, BIND_AUTO_CREATE); 19 } 20 21 //解綁服務 22 public void unbindService(View view) { 23 24 unbindService(conn); 25 } 26 27 /** 28 * 調用服務裏的方法 29 */ 30 public void callService(View view) { 31 //經過內部的小蜜能夠間接調用服務裏的方法 32 System.out.println("5,利用myBinder間接調用服務裏的方法"); 33 myBinder.callMethodInService(500); 34 } 35 36 37 /** 38 * 服務成功鏈接的通信頻道 39 */ 40 private class MyConn implements ServiceConnection{ 41 42 //服務成功鏈接時 43 @Override 44 public void onServiceConnected(ComponentName name, IBinder service) { 45 System.out.println("3,獲得了服務的連接,獲取到了小蜜"); 46 myBinder = (IService) service; 47 System.out.println("4,將IBinder強制轉換爲小蜜myBinder"); 48 } 49 50 //服務鏈接不成功時 51 @Override 52 public void onServiceDisconnected(ComponentName name) { 53 54 } 55 } 56 }
關鍵代碼已經用紅色標出開發
在這個demo中, Activity想直接調用服務中的方法是辦不到的, 因而能夠定義一個代理Iservice接口,it
讓Service中的內部類Xiaomi來實現該接口, 並重寫抽象方法, 這樣就能夠在Activity中調用了.