文档章节

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
海淀
私信 提问
如何启动/停止/重启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
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
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
Kubernetes Service & LB & Networking :Services

Service 创建 1、With Label Selector 使用标签选择器创建服务,Service 直接关联 Pod,示例:部署 Mysql (细节见文末附录1),再创建服务: 2、Without Label Selector Service 通常抽象化...

Anoyi
06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Idea

command + E : 打开最近编辑过的文件 command + O : 打开指定文件 option + enter: 补全变量 实现接口 格式化字符串 System.out.printf("realName:" + u.getRealName() + "email: " + u.get...

xpttxsok
26分钟前
1
0
FTP 协议 1.0

自己制作的FTP协议:

Explorer0
37分钟前
2
0
Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
48分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
54分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部