文档章节

Service的使用(2)

c
 chuiyuan
发布于 2014/05/11 20:50
字数 661
阅读 130
收藏 4

    服务 相当于一个没有界面 的Activity 。运行在后台 ,不可交互,不可以自己启动,要用别的Context 来执行startService () 或者 bindService()来绑定。

Service工作的机制 是

(1) client 成功地 bind Service 

(2) Service 传递一个 IBinder 给 Client

(3) client 可以直接调用  Service 的方法与接口

一。服务的新建 

服务重写 的方法有6个,已经包括 了默认的 onBind()方法。如下

@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

我们注意到,onBind()方法将传递一个 IBinder 给client  . IBinder 作用是负责Service 与Client 的通信 。 说明 下

Bind implements  IBinder

这里的关键代码 如下 

public class MyBinder extends Binder  {
		MyService getService (){
			return MyService.this;            //返回一个Service 
		}
	}
	
	private final IBinder binder = new MyBinder();
	
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		Log.i(TAG,"=====>onBinder");
		Toast.makeText(getBaseContext(), "onBinder", Toast.LENGTH_SHORT).show();
		return binder;
	}

这里,我们写了一个继承Binder 的内部类。用于向Activity 中返回 Service对象 。

为了使用Service  ,我们在Manifest.xml  文件中还对Service 进行注册。注意,与Activity  平级。

    <service  android:enabled="true"
            android:name=".MyService"></service>


二。启动Service 

    有两种方法启动

ConextWrapper.startService (Intent service );

ContextWrapper.bindService (Intent service , ServiceConnection conn ,int flags );

(1)先用方法一,这里的 Service 独立运行在后台 ,不受  Activity 的生命周期的影响 。当所有 Activity 都退出 时,Service 还是在执行,只到有Context 调用 stopService ()才停止 。

startBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent (ServiceDemo.this,MyService.class);
				startService(i);
			}		
		});
stopBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i1 = new Intent (getBaseContext(),MyService.class);
				stopService(i1);
			}		
		});

我们点击运行后,发现运行过程 是

startBtn :onCreate( )---->onStart() 

stopBtn : onDestroy()


(2)在方法二中 ,我们用bindService() 。

    这种 方法里,只要  Activity 结束,Service 也结束 。使用 bindService () ,我们还要一个 ServiceConnection 对象 ,作用是实现 Activity 与 Service 的绑定。

如下:

MyService mService;
	ServiceConnection mConnection = new ServiceConnection (){
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			mService = ((MyService.MyBinder)service).getService();
			//连接成功
		}
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			mService =null;
		}		
	};

在ServiceConnection中,我们实现 了两方法。关于连接成功的。

在连接Service 的时候 ,我们会调用 onBind()方法,在方法中,我们返回了一个 IBinder对象 ,这个 对象 就是参数 service 。我们将 IBinder 类型转化 成之前 的MyBinder  内部类对象 ,再通过 这个 

对象 的getService ()方法得到Service 的操作对象 。

最后代码如下 :

startBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent (ServiceDemo.this,MyService.class);
				bindService (i, mConnection ,Context.BIND_AUTO_CREATE);  
				//绑定服务
			}		
		});
		stopBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				unbindService(mConnection);
				
			}		
		});
	}

运行过程 是:

bind: onCreate () ------>onBind()

unbind: unbindService()----->onDestroy()

事实上 在bindService() 时,Service  有一个原则,只给执行一次 onCreate() .




© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 92
码字总数 40993
作品 0
海淀
Linux启动/停止/重启Mysql数据库的方法

1、查看mysql版本 方法一:status; 方法二:select version(); 2、Mysql启动、停止、重启常用命令 a、启动方式 1、使用 service 启动: [root@localhost /]# service mysqld start (5.0版本是...

林夕2018
2016/09/29
0
0
如何启动/停止/重启MySQL

一、启动方式 1、使用 service 启动:service mysqld start 2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3、使用 safemysqld 启动:safemysqld& 二、停止 1、使用 service 启动:s...

afriendly
2014/03/29
0
0
Android service (一) startService vs bindService

service 简介 service 是Android的4大组件之一, 用于在后台(这里指的是service不提供UI, 用户不可见)执行任务. service 是在UI线程上被创建, 并且在UI线程上运行的, 如果service需要执行耗时...

风荷举
2016/06/06
320
0
Android静态安全检测 -> Service组件暴露

Service组件暴露 - exported属性 一、android:exported 该属性用来标示,其他应用的组件是否可以唤醒Service或者和这个Service进行交互 1. true 表示可以 2. false 【1】表示不可以,只有同一...

老鹰a
2017/12/21
0
0
mysql基础命令

操作 命令 exp 登录 -u 用户名 -p 密码 mysql -u root -p 启动 1、使用 service 启动:service mysqld start 2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3、使用 safemysqld 启动:...

沉默的懒猫
2016/07/22
17
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache Spark 2.3 重要特性介绍

本文翻译自:https://databricks.com/blog/2018/02/28/introducing-apache-spark-2-3.html 为了继续实现 Spark 更快,更轻松,更智能的目标,Spark 2.3 在许多模块都做了重要的更新,比如 St...

hblt-j
9分钟前
1
0
Git基本操作

Git基本操作 git add . git commit git commit -m "updata" git log查看日志 git checkout xxx 切换分支到xxx 常用命令 版本库管理 创建版本库 # 初始化版本库mkdir learngit && cd learng...

lslaiwy
12分钟前
1
0
ubuntu 彻底删除 mysql 然后重装 mysql

ubuntu 彻底删除 mysql 然后重装 mysql 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-......

关上越
16分钟前
1
0
Fabric.js高级点的教程3--添加遮罩和裁剪的方法

写这篇文章的时候我就要说一下了,这个遮罩和裁剪耗费了我真的是九牛二虎之力 裁剪的插件很多,无论你用原生JS,JQuery, Vue还是React.总能找到一款裁剪插件。今天我要说的是自己写一个截图功...

xmqywx
18分钟前
1
0
springboot 初始化不设置数据源 由接口动态设置数据源(传入ip 端口 数据库名称 账号 密码)

程序无需重启可以加个过滤器支持未设置数据库无法调用将配置存到property文件,也可存到缓存设置时需要一个工具类判断传入的数据库是否可连接等import org.apache.commo...

林伟琨
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部