Service简介
1、什么是Service(服务)
服务是在后台运行,没有界面,运行在当前应用程序进程里面的组件。和windows中的服务很类似,它运行与系统中,不容易被用户发觉。
2、服务有什么用?
a、监视一个硬件是否被插入,如手机sd卡。
b、连接服务器刷新最新的数据
c、定时轮询(音乐播放器后台播放)
注意:服务是运行在主线程中,不可以直接在里面写耗时的操作。
3、怎么用?
首先我们看两张服务的生命周期的图解:
由图可知启动service的方式有两种:
第一种:通过调用Context.startService() ,这种对应着上图的左面的生命周期,如果开启服务,不调用stop(),服务会一直在系统中运行。在系统设置界面中可以观察到。但是应用程序不可以调用服务里面的方法。
第二种:通过调用Context.bindService(),这种对应着上图的右面的生命周期,开启服务后如果应用结束,服务
也会随之结束。在系统设置界面中看不到,通过这种方式可以通过中间人对象间接调用服务中的方法。
混合的方式开启服务:当需要服务长期后台运行,而且调用到服务中的方法的时候,使用混合的方式开启服务。
开启的步骤:先用start的方式开启-->绑定服务-->解除绑定-->停止服务;
4、示例代码
a.使用Context.startService()开启服务示例代码
开启服务的MainActivity
package com.itheima.servicedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 开启服务
public void start(View view) {
Intent intent = new Intent(this, TestService.class);
// 下面的代码执行完毕,得不到服务的引用,因为服务是框架new出来.我们Activity里面得不到服务的引用
startService(intent);
}
// 停止服务
public void stop(View view) {
Intent intent = new Intent(this, TestService.class);
stopService(intent);
}
// 调用服务里面的方法
public void call(View view) {
//我们不能自己new服务,自己new服务得不到上下文,打印土司会失败.
TestService testService = new TestService();
testService.methodInService("哈哈");
}<pre name="code" class="java">
服务代码:
package com.itheima.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class TestService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
System.out.println("服务被开启了");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("服务被停止了.");
super.onDestroy();
}
public void methodInService(String msg){
Toast.makeText(this, "我是服务里面的方法,我被调用了,传递过来一个消息:"+msg, 0).show();
}
}
b.使用Context.bindService()开启服务的代码
绑定服务的代码
package com.itheima.bind;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
public class MainActivity extends Activity {
/**
* 代理人
*/
private IService myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 绑定服务获取中间人
*/
public void bind(View view){
Intent intent = new Intent(this,TestService.class);
//conn 通讯频道. BIND_AUTO_CREATE如果服务不存在,会把服务创建出来.
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
}
private class MyConn implements ServiceConnection{
//当服务被成功连接的时候调用的方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("在Activity得到了服务返回的代理人对象,IBinder");
myBinder = (IService) service;
}
//当服务失去连接的时候调用的方法.
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
/**
*通过中间人调用服务里面的方法
*/
public void call(View view){
//myBinder.callMethodInService("小华华", 250);
myBinder.callMethodInService("小华华", 250);
}
}
服务:
package com.itheima.bind;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;
/**
* 官员
*/
public class TestService extends Service {
/**
* 服务内部的中间人 小蜜
*/
private class MyBinder extends Binder implements IService{
/**
* 中间人帮忙简介的调用服务的方法.
*
* @param name
* 姓名
* @param money
* 钱
*/
public void callMethodInService(String name, int money) {
if (money > 200) {
methodInService(name);
}else{
Toast.makeText(TestService.this, "这点钱不够用,我们要按照制度办事", 0).show();
}
}
public void 洗桑拿(){
Toast.makeText(TestService.this, "走,一起去洗桑拿吧...", 0).show();
}
public void 打麻将(){
Toast.makeText(TestService.this, "走,一起去打麻将吧...", 0).show();
}
}
// 在服务成功绑定的时候 返回服务中的代理人(中间人)
@Override
public IBinder onBind(Intent intent) {
System.out.println("服务被绑定了, 返回IBinder的中间人");
return new MyBinder();
}
@Override
public void onCreate() {
System.out.println("服务被创建了..");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("服务被销毁了..");
super.onDestroy();
}
/**
* 服务内部的方法,帮助你办暂住证.
*
* @param name
* 姓名
*/
public void methodInService(String name) {
Toast.makeText(this, name + "你的暂住证办好了...", 0).show();
}
}