文档章节

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
跟我学习dubbo-在Linux操作系统上手工部署Dubbo服务(5)

在Linux操作系统上手工部署Dubbo服务 1、环境变量配置 Java环境变量----只需要JRE vi /etc/profile ## java env export JAVAHOME=/usr/local/java/jdk1.7.072 export JREHOME=$JAVAHOME/jre......

HI曲奇饼干
2016/01/09
153
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 使用 Fail2Ban 来限制登录尝试

什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解。Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptables)直接工作来来启用...

honeymose
8分钟前
0
0
日期和时间API - 读《Java 8实战》

日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014Sys...

yysue
8分钟前
0
0
8月15日任务

8月15日任务 Memcached命令行 • telnet 127.0.0.1 11211 • set key2 0 30 2 ab STORED get key2 VALUE key2 0 2 ab END 实例: [root@localhost 02]# telnet 127.0.0.1 11211-bash: te......

寰宇01
21分钟前
0
0
LNMP架构(Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间)

Nginx访问日志 1.打开配置文件,搜索log_format vim /usr/local/nginx/conf/nginx.conf 2.访问日志常用变量含义 $remote_addr : 客户端IP(公网IP) $http_x_forwarded_for : 代理服务器的IP ...

蛋黄_Yolks
21分钟前
0
0
lombok 不用再写pojo的getset

java实体类不写get/set方法 1、下载地址https://projectlombok.org/download Myeclipse、eclipse安装lombok Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网...

木之下
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部