綁定服務調用本地服務中的方法

若是想調用服務中的方法, 經過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中調用了.

相關文章
相關標籤/搜索