Service的启动与停止、绑定与解绑

---恢复内容开始---

  Service的意义就在于当软件停止之后还可以在背景中进行运行,换句话也就是说,比如一个音乐播放器,当我们退出音乐播放器的时候,还是希望它在背景中运行,也就是一直播放着音乐,这时候Service就派上了大的用途。

  Service的生命周期和Activity的生命周期差不多。也有开启和停止。onCreate()方法是初始化配置,onDestroy()是释放所有剩余的资源。Service周期是发生在onCreate()和onDestroy()之间的。

    startService()方法是启动Service。

    StopService()方法是停止Service。

    bindService()方法是启动Service的激活生命周期始于onBind()调用,在onUnbind()返回时结束。

  当一个组件启动Service时,是通过startService()进行启动Service,当Service被启动之后,onStartCommand()方法被调用,并且接收startService()方法中传递的Intent值。

  onStartServiceCommand()方法必修返回一个整形值。这个整形值是说明了Service在系统中如何执行。其中三个比较常用的解释如下:

    START_NOT_STICKY:如果系统在onStartServiceCommand()返回后杀死Service,那么不会重新创建Service,除非有等待的Intent要传递。

    START_STICKY 如果系统在onStartServiceCommand()返回后杀死Service,重启Service,并且重新调用onStartServiceCommand(),但不重新传递最新的Intent。

    START_REDELIVER_INTENT 如果系统在onStartServiceCommand()返回后杀死Service,那么重新创建Service,并且最近传给Service的Intent调用onStartServiceCommand()。

  创建一个Service启动周期的实例

  

 1 public class MyService extends Service{
 2
 3     //必须实现的方法,作用是用来返回binder对象
 4
 5
 6     //重写onBind()方法,返回Service实例,使Service支持绑定,实现onBind()方法,并且返回MyService实例
 7     @Override
 8     public IBinder onBind(Intent intent) {
 9         // TODO Auto-generated method stub
10         System.out.println("--onBind--");
11         return null;
12     }
13
14
15     //用于创建Service的方法,只能调用一次
16     public void onCreate(){
17         super.onCreate();
18         System.out.println("--onCreate--");
19
20     //每次启动Service时都会调用这个方法
21     @Override
22     public int onStartCommand(Intent intent, int flags, int startId) {
23         // TODO Auto-generated method stub
24         System.out.println("--onStartCommand--");
25         return super.onStartCommand(intent, flags, startId);
26     }
27
28     //解绑的时候使用的这个方法
29     @Override
30     public boolean onUnbind(Intent intent) {
31         // TODO Auto-generated method stub
32         System.out.println("--onUnbind--");
33         return super.onUnbind(intent);
34     }
35
36     //退出或者销毁的时候使用这个方法
37     @Override
38     public void onDestroy() {
39         // TODO Auto-generated method stub
40         serviceRunning = false;
41         System.out.println("--onDestroy--");
42         super.onDestroy();
43
44     }
45
46 }

注意:在测试的时候一定要在onCreate()方法中写一个多线程,以便输出,让我们更加的明白。如下:

 1 //用于创建Service的方法,只能调用一次
 2     public void onCreate(){
 3         super.onCreate();
 4         System.out.println("--onCreate--");
 5         serviceRunning = true;
 6         new Thread(){
 7             public void run(){
 8                 while(serviceRunning){
 9                     System.out.println("--Service运行中--");
10                     try{
11                         sleep(1000);
12                     }catch(Exception e){
13                         e.printStackTrace();
14                     }
15                 }
16             }
17         }.start();
18     }

绑定Service

  绑定Service的时候会比较的复杂,其中,看绑定方法bindService(Intent service, ServiceConnection conn, int flags)时大家就可以看出。其中Intent需要传递Intent的值,conn是ServiceConnection的实例,flags是所需要的一个标示。下面就为大家解析绑定Service所需要的三个步骤:

  第一步:需要在Service中创建一个Binder接口,并且实现:

  1. 包含客户端可以调用public方法
  2. 或返回当前Service的实例--也包含客户端可以调用的Public方法
  3. 或返回Service持有的其他类型的实例--也包含客户端可以调用的Public方法

  代码如下:

public class MyBinder extends Binder{
		MyService getService(){
			return MyService.this;
		}
	}

  

   第二步:在onBind()中返回Binder实例。

  代码如下:

1 //必须实现的方法,作用是用来返回binder对象
2 //重写onBind()方法,返回Service实例,使Service支持绑定,实现onBind()方法,并且返回MyService实例
3     @Override
4     public IBinder onBind(Intent intent) {
5         // TODO Auto-generated method stub
6         System.out.println("--onBind--");
7         return null;
8     }

  第三步:在客户端中,从onServiceConnected()回调方法中接收这个Binder,并且使用Binder包含的Service提供的方法。

  比如:

 1 public class MyServiceConn implements ServiceConnection{
 2
 3     MyService.MyBinder binder = null;
 4
 5     @Override
 6     public void onServiceConnected(ComponentName name, IBinder service) {
 7         // TODO Auto-generated method stub
 8         binder = (MyService.MyBinder)service;
 9     }
10
11     @Override
12     public void onServiceDisconnected(ComponentName name) {
13         // TODO Auto-generated method stub
14         binder = null;
15     }
16
17 }

  注意:一定要在客户端中声明这个实例:

1 final MyServiceConn myserviceconn = new MyServiceConn();

  客户端在合适的时候也可以进行解绑:

1 //解除绑定的Service
2         unbind.setOnClickListener(new OnClickListener() {
3
4             @Override
5             public void onClick(View v) {
6                 // TODO Auto-generated method stub
7                 unbindService(myserviceconn);
8             }
9         });

  上述就把Service的启动、停止、绑定、解绑就完成了,下面的则是客户端的一些的代码:

  

 1 import android.app.Activity;
 2 import android.content.ComponentName;
 3 import android.content.Context;
 4 import android.content.Intent;
 5 import android.content.ServiceConnection;
 6 import android.os.Bundle;
 7 import android.os.IBinder;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11
12 public class MainActivity extends Activity {
13
14     private Button start;
15     private Button stop;
16     private Button bind;
17     private Button unbind;
18     private Intent intent;
19
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24         start = (Button)findViewById(R.id.btn1);
25         stop = (Button)findViewById(R.id.btn2);
26         bind = (Button)findViewById(R.id.btn3);
27         unbind = (Button)findViewById(R.id.btn4);
28
29         final MyServiceConn myserviceconn = new MyServiceConn();
30
31         //给按钮设置事件,以便监听Service中的变化
32         //开启service
33         start.setOnClickListener(new OnClickListener() {
34
35             @Override
36             public void onClick(View v) {
37                 // TODO Auto-generated method stub
38                 intent = new Intent(getApplicationContext(),MyService.class);
39                 startService(intent);
40             }
41         });
42
43         //结束Service
44         stop.setOnClickListener(new OnClickListener() {
45
46             @Override
47             public void onClick(View v) {
48                 // TODO Auto-generated method stub
49                 stopService(intent);
50             }
51         });
52
53         //绑定service服务
54         bind.setOnClickListener(new OnClickListener() {
55
56             @Override
57             public void onClick(View v) {
58                 // TODO Auto-generated method stub
59                 bindService(intent,myserviceconn,Context.BIND_AUTO_CREATE);
60             }
61         });
62
63         //解除绑定的Service
64         unbind.setOnClickListener(new OnClickListener() {
65
66             @Override
67             public void onClick(View v) {
68                 // TODO Auto-generated method stub
69                 unbindService(myserviceconn);
70             }
71         });
72     }
73
74
75 }

XML文件的代码(只是一些简单的按钮,就不解释了):

  

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:id="@+id/LinearLayout1"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context=".MainActivity" >
 8
 9     <TextView
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="@string/service" />
13
14     <Button
15         android:id="@+id/btn1"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:text="StartService" />
19
20     <Button
21         android:id="@+id/btn2"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:text="StopService" />
25
26     <Button
27         android:id="@+id/btn3"
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:text="bindService" />
31
32     <Button
33         android:id="@+id/btn4"
34         android:layout_width="wrap_content"
35         android:layout_height="wrap_content"
36         android:text="unBindService" />
37
38 </LinearLayout>

一定要注意在AndroidManifest.xml文件中加上权限:

1 <service            android:name="com.example.servicetest.MyService">
2  </service>

  到这里就完了,有什么不懂或者不对的地方可以留言,至于截图,上述的代码比较详细,我这里就不贴出了。

---恢复内容结束---

时间: 2024-07-31 14:32:26

Service的启动与停止、绑定与解绑的相关文章

jquery中事件重复绑定以及解绑问题

一般的情况下,对于这种情况,我们常规的思路是,先解绑,再绑定,如下: $(selector).unbind('click').bind('click',function(){....}); 当这样会有一个问题,unbind会把其之前的所有的click事件都unbind掉,可能会影响其他的绑定,有如下有两种方法解决: 第一种: 使用事件命令空间,来唯一标识这个click的绑定,这样在解绑是不会将其他click绑定的事件也给解绑. $(selector).unbind('click.selector

jquery中的DOM事件绑定与解绑

在jquery事件中有时候有的事件只需要在绑定后有效触发一次,当通过e.target判断触发条件有效触发后解除绑定事件,来避免多次无效触发和与未知情况造成冲突. 这时候就要用到了jquery中的事件绑定与事件解绑. 1 $(document).on('click.endEdit',function (e) { 2 if(!$(e.target).hasClass('datagrid-cell')&&e.target.tagName!="TD"){ //事件发生后的判断条

js元素事件绑定与解绑

为元素绑定事件有3种方式: 1.最常见的绑定方式: document.getElementById("btn").onclick=function(){}; 2.非IE浏览器     element.addEventListener(type,fn,false) (布尔值====true表示捕获,false表示冒泡,一般用false): document.getElementById("btn").addEventListener("click"

JQuery_003_事件绑定与解绑

$(function () { //第一个按钮通过on的方式绑定点击事件 $("#btn1").on("click",function () { alert("我被点了"); }); //第二个按钮把第一个按钮的点击事件解绑 $("#btn2").on("click",function () { //off()参数:要解绑的事件的名字 $("#btn1").off("click

事件绑定与解绑

var EventUtil = { addHandler:function (obj, type, handler) { if(obj.addEventListener) { //如果是标准浏览器,即支持addEventListener的 console.log('标准浏览器'); obj.addEventListener(type, handler); } else if(obj.attachEvent) { //IE低版本浏览器 console.log('IE低版本浏览器'); obj.at

jquery绑定事件,解绑事件

unbind([type],[data]) 是 bind()的反向操作,从每一个匹配的元素中删除绑定的事件.如果没有参数,则删除所有绑定的事件.你可以将你用bind()注册的自定义事件取消绑定.如果提供了事件类型作为参数,则只删除该类型的绑定事件.如果把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除.返回值 : jQuery参数 :type (String) : (可选) 事件类型data (Function) : (可选) 要从每个匹配元素的事件中反绑定的事件处理函

jquery 事件- 绑定与解绑

一.on() 的多事件绑定 $("#elem").on("mouseover mouseout",function(){ }); //多个事件绑定一个函数 $("#elem").on({ //多个事件绑定不同函数 mouseover:function(){}, mouseout:function(){} }); <div class="left"> <p class="aaron">

jQuery-3.事件篇---事件绑定与解绑

on()的多事件绑定 之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理.翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个"on"方法来实现的.jQuery on()方法是官方推荐的绑定事件的一个方法. 基本用法:.on( events ,[ selector ] ,[ data ] ) 最常见的给元素绑定一个点击事件,对比一下快捷方式与on方式的不同 $("#elem").click(funct

【JQ】jq动态绑定事件.on()、解绑事件off()

#JQ 绑定与解绑事件的方法的历史演变 1. jquery1.4 及之前的版本,由.click() 或 .bind()方法绑定的事件,不能适用脚本创建的新元素:即是说页面加载完成后,再动态创建的DOM元素并不能响应之前绑定的事件!解绑事件使用.unbind()方法: 旧版本的处理方法是使用.live()方法来代替事件绑定.bind(),使得绑定的事件能适用脚本创建的新元素,从而实现事件的动态绑定:解绑事件使用.unlive()方法: 1 <html> 2 <head> 3 <