27、Service

1服务可以通过startservice的方法 开启。通过stopservice的方法 停止。

服务有一个特点: 只会一次onCreate()方法一旦被创建出来,以后oncreate() 就不会再被执行了,
以后再去开启服务 只会执行onstart()方法,当服务被停止的时候 onDestroy();

2 服务通过bindservice的方法开启
首先 如果服务不存在 就会执行 oncreate() ->onbind()方法
一旦服务绑定成功 以后再去执行 bindsercie() 就不会在重新创建 或者绑定服务了();

如果我们现实的调用unbindservice()的方法 ,首先 on unbind()方法 -> ondestroy() ;
服务只能被解除绑定一次 多次解除绑定服务 程序会出异常.

开启服务 (startservice)
服务一旦开启与调用者没有任何的关系 , 调用着的activity 即便是退出了 也不会影响
后台的service的运行.
在activity里面 不能去调用服务里面的方法 (因为Service是框架new出来的,activity无法获取到该Service的引用).

通过绑定方式开启服务(bindservice)
服务跟调用者不求同生 ,但求同死.
如果调用者(activity)退出了 那他绑定的服务呢 也会跟着退出.

我们可以在activity里面调用服务里面的方法.

利用 serviceSonnection 接口 返回一个ibinder对象 , 拿着ibinder对象获取到服务里面方法的引用(自定义了一个接口信息) 调用服务里面的方法。

一个应用程序 一个进程里面 定义一个IService 的接口来描述方法

如果我们要调用另外一个进程 服务里面的方法 aidl(android interface defination language)

总结流程:

1.要想访问 一个服务里面的方法 我们需要用到 bindservice();
一 创建一个服务 这个服务里面有一个要被调用的方法.
二 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法。 
三 定义一个mybinder对象 extends IBinder对象 实现 我们声明的接口IService, 在onbind
方法里面把mybinder返回回去。
四 在activity里面 通过bindservice的方法开启服务。 
五 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法。
这个方法会有一个参数 这个参数就是 MyBinder的对象。 
六 把mybinder强制类型转化成 IServcie。
七 调用IService里面的方法。

范例:开启、停止、绑定、解除绑定、调用服务里面的方法。

1 public interface IService {
2     public void callMethodInService();
3 }
 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 /**
13  * 通过startservice开启服务的生命周期。
14  * 利用bindservice调用服务里面的方法。
15  * @author dr
16  */
17 public class DemoActivity extends Activity implements OnClickListener {
18
19     Button bt_start, bt_stop;
20     // 绑定服务 解除绑定服务
21     Button bt_bind_service, bt_unbind_service;
22     Button bt_call_service;
23     Intent intent;
24     MyConn conn;
25     IService iService;
26
27     @Override
28     public void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.main);
31
32         bt_start = (Button) this.findViewById(R.id.button1);
33         bt_stop = (Button) this.findViewById(R.id.button2);
34         bt_bind_service = (Button) this.findViewById(R.id.button3);
35         bt_unbind_service = (Button) this.findViewById(R.id.button4);
36         bt_call_service = (Button) this.findViewById(R.id.button5);
37         bt_start.setOnClickListener(this);
38         bt_stop.setOnClickListener(this);
39         bt_bind_service.setOnClickListener(this);
40         bt_unbind_service.setOnClickListener(this);
41         bt_call_service.setOnClickListener(this);
42         intent = new Intent(this, MyService.class);
43         conn = new MyConn();
44     }
45
46     @Override
47     public void onClick(View v) {
48         switch (v.getId()) {
49         case R.id.button1: // 开启服务
50             startService(intent);
51             break;
52         case R.id.button2: // 停止服务
53             stopService(intent);
54             break;
55         case R.id.button3: // 绑定服务
56             bindService(intent, conn, Context.BIND_AUTO_CREATE);
57             break;
58         case R.id.button4: // 解除绑定服务
59             unbindService(conn);
60             break;
61         // 绑定开启
62         case R.id.button5: // 调用服务里面的方法
63             iService.callMethodInService();
64             break;
65         }
66     }
67
68     private class MyConn implements ServiceConnection {
69         // 绑定一个服务成功的时候 调用 onServiceConnected
70         @Override
71         public void onServiceConnected(ComponentName name, IBinder service) {
72             // 绑定成功后,会返回这个IBinder对象(MyService中的onBind返回的)。
73             iService = (IService) service;
74         }
75
76         @Override
77         public void onServiceDisconnected(ComponentName name) {
78
79         }
80     }
81
82     @Override
83     protected void onDestroy() {
84         unbindService(conn);
85         super.onDestroy();
86     }
87
88 }
 1 import android.app.Service;
 2 import android.content.Intent;
 3 import android.os.Binder;
 4 import android.os.IBinder;
 5
 6 public class MyService extends Service {
 7
 8     @Override
 9     public IBinder onBind(Intent intent) {
10         System.out.println("on bind");
11         return new MyBinder();
12     }
13
14     public class MyBinder extends Binder implements IService {
15         @Override
16         public void callMethodInService() {
17             sayHelloInService();
18         }
19     }
20
21     /**
22      * 服务里面的一个方法
23      */
24     public void sayHelloInService() {
25         System.out.println("hello in service");
26     }
27
28     @Override
29     public boolean onUnbind(Intent intent) {
30         System.out.println("on  unbind");
31         return super.onUnbind(intent);
32     }
33
34     @Override
35     public void onCreate() {
36         System.out.println("oncreate");
37         super.onCreate();
38     }
39
40     @Override
41     public void onStart(Intent intent, int startId) {
42         System.out.println("onstart");
43
44         super.onStart(intent, startId);
45     }
46
47     @Override
48     public void onDestroy() {
49         System.out.println("ondestroy");
50         super.onDestroy();
51     }
52 }

2.要想访问一个远程服务里的方法 需要用到aidl
一 创建一个服务 这个服务里面有一个要被调用的方法.
二 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法。 
把.java的后缀名改成aidl 把接口里面定义的访问权限的修饰符都给删除。
三 定义一个mybinder对象 extends IService.Stub, 在onbind方法里面把mybinder返回回去。
四 在activity里面 通过bindservice的方法开启服务。
五 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法,这个方法会有一个参数 这个参数就是MyBinder的对象。
六 IService = IService.Stub.asInterface(myBinder)。
七 调用IService的方法。

范例:

范例:

时间: 2024-10-25 09:51:20

27、Service的相关文章

Spring注解@Component、@Repository、@Service、@Controller区别

Spring注解@Component.@Repository.@Service.@Controller区别 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

Spring注解@Component、@Repository、@Service、@Controller的相关知识

Spring注解@Component.@Repository.@Service.@Controller区别 spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

URL:http://www.ulewo.com/user/10001/blog/273 我们在使用spring的时候经常会用到这些注解,那么这些注解到底有什么区别呢.我们先来看代码 同样分三层来看: Action 层: package com.ulewo.ioc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Co

@Component、@Service、@Constroller

@Component.@Service.@Constroller,@Repository,它们分别用于软件系统的不同层次: @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次. @Service 通常作用在业务层,但是目前该功能与 @Component 相同. @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同 @Repository通常用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean 为了让

【足迹C++primer】27、vector对象是如何增长的

vector对象是如何增长的 当需要更多空间的时候,会重新分配比新空间需求更大的内存空间,作为备用 管理容器的成员函数 shrink_to_fit //只适用于vector,string,deque capacity reserve //只适用于vector,string c.shrink_to_fit() //请将capacity()减少为与size相同大小 c.capacity() //不重新分配内存空间的话,c可以保存多少元素 c.reserve(n) //分配至少能容纳n个元素的内存空间

最近面试的题目(WEB、Service、SQL、JavaScript)

整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对),也包括部分别人被问及的. 一.HTML.CSS position有哪几种值,各是怎么使用的? 一个左右部局,如何实现? 二.JAVASCRIPT, JS FRAMEWORK document.onload与jQuery中的ready有何区别? 什么是闭包?写一下. jQuery中有个叫"on&quo

AndroidManifest.xml里加入不同package的component (Activity、Service里android:name里指定的值一般为句号加类名),可以通过指定完全类名(包名+类名)来解决

我们都知道对于多个Activity如果在同一个包中,在Mainfest中可以这样注册 Xml代码   <span style="font-size: small;"><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=&

angularJs 解析factory、service、provider

了解angular js factory可以认为是设计模式中的工厂方法,就是你提供一个方法,该方法返回一个对象的实例:对于angularJs的factory,就是先定义一个对象,给这个对象添加属性和方法,然后返回这个对象.例如:var app = angular.module("MyApp",[]);app.factory("MyFactory",function(){ var result = {}; result.greeting = "Hello f

@Repository、@Service、@Controller 和 @Component

@Repository .@Service . @Controller .@Component 这四个Spring注解 ,用于把加了注解的 类 加入到Spring 容器中管理,节省了xml 的繁重的配置,尽管如此xml 同样可以实现(一般建议先搞懂xml). @Repository @Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别