码迷,mamicode.com
首页 > 其他好文 > 详细

绑定服务

时间:2016-03-29 12:47:42      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

1、绑定服务的作用:可以在其他地方调用服务里的方法

2、代码实现:

1)视图

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context=".MainActivity" >
 7 
 8     <Button
 9         android:onClick="start"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="开启服务" />
13     
14     <Button
15         android:onClick="stop"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:text="停止服务" />
19     
20     <Button
21         android:onClick="change"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:text="改变歌曲" />
25     
26      <Button
27         android:onClick="bind"
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:text="绑定服务" />
31      
32       <Button
33         android:onClick="unbind"
34         android:layout_width="wrap_content"
35         android:layout_height="wrap_content"
36         android:text="断开绑定" />
37      
38     
39 
40 </LinearLayout>

2)清单文件

 <service android:name=".SongService"></service>

3)activity代码,主要用来绑定和解除绑定的

 1 package com.example.songservice;
 2 
 3 import com.example.songservice.SongService.MyBinder;
 4 
 5 import android.os.Bundle;
 6 import android.os.IBinder;
 7 import android.app.Activity;
 8 import android.content.ComponentName;
 9 import android.content.Intent;
10 import android.content.ServiceConnection;
11 import android.view.Menu;
12 import android.view.View;
13 
14 public class MainActivity extends Activity {
15 
16     private SongService.MyBinder mybinder;
17     private Myconn conn;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22     }
23 
24     public void start(View view){
25         Intent intent = new Intent(this, SongService.class);
26         startService(intent);
27     }
28     
29     public void stop(View view){
30         Intent intent = new Intent(this, SongService.class);
31         stopService(intent);
32     }
33     
34     public void change(View view){
35         //关于直接new对象不行的原因?因为在开启服务时会创建与之对应的上下文;而如果采用new对象的方式,是没有上下文的
36         mybinder.changeSong("最炫民族风");
37     }
38     
39     @Override
40     protected void onDestroy() {
41         // TODO Auto-generated method stub
42         
43             try {
44                 unbindService(conn);
45             } catch (Exception e) {
46                 // TODO Auto-generated catch block
47                 e.printStackTrace();
48             }
49     
50         super.onDestroy();
51     }
52 
53     public void bind(View view){
54         Intent intent = new Intent(this, SongService.class);
55         conn = new Myconn();
56         //第一个参数,说明要开启的服务
57         //第二个参数,中间人
58         //第三个参数,绑定服务时,如果服务不存在,则自动创建
59         bindService(intent, conn, BIND_AUTO_CREATE);
60     }
61     
62     public void unbind(View view){
63         unbindService(conn);
64     }
65     
66     //与服务联系的回调对象
67     private class Myconn implements ServiceConnection{
68         //在服务被绑定成功时调用的方法
69         @Override
70         public void onServiceConnected(ComponentName name, IBinder service) {
71             // TODO Auto-generated method stub
72             System.out.println("代理人被返回回来");
73             mybinder = (MyBinder)service;
74         }
75         
76         //在服务失去绑定时调用的方法,只有在程序异常终止才调用
77         @Override
78         public void onServiceDisconnected(ComponentName name) {
79             // TODO Auto-generated method stub
80             
81         }
82         
83     }
84 
85 }

4)服务类的代码

 1 package com.example.songservice;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 import android.widget.Toast;
 8 
 9 public class SongService extends Service {
10 
11     @Override
12     public IBinder onBind(Intent intent) {
13         // TODO Auto-generated method stub
14         System.out.println("春哥的服务被绑定了");
15         return new MyBinder();
16     }
17     
18     //代理人;如果把public改为private,则可以使用接口进行代替
19     public class MyBinder extends Binder{
20         public void changeSong(String name){
21             change(name);
22         }
23     }
24     
25     
26     @Override
27     public boolean onUnbind(Intent intent) {
28         // TODO Auto-generated method stub
29         System.out.println("onUnbind 被调用了");
30         return super.onUnbind(intent);
31     }
32 
33     @Override
34     public void onCreate() {
35         // TODO Auto-generated method stub
36         super.onCreate();
37         System.out.println("开始唱歌");
38     }
39 
40     @Override
41     public void onDestroy() {
42         // TODO Auto-generated method stub
43         super.onDestroy();
44         System.out.println("停止唱歌");
45     }
46     
47     public void change(String songName){
48         Toast.makeText(getApplicationContext(), "改唱歌曲为" + songName, 0).show();
49     }
50     
51     
52 
53 }

注意事项:

1、如果已经绑定了服务,并且不解除绑定,直接退出activity,就会报错;除非先解除绑定,然后再退出
2、如果以绑定服务的方式开启服务,则解除绑定时服务会停止
3、如果以绑定服务的方式开启服务,直接退出,则会报错;并且服务会被销毁
4、正常的方法是:开启服务->绑定服务->解除绑定
5、多次解除绑定程序会报错

 

绑定服务

标签:

原文地址:http://www.cnblogs.com/zhongyinghe/p/5332421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!