文档章节

Service的使用(1)

c
 chuiyuan
发布于 2014/05/11 16:55
字数 1008
阅读 51
收藏 0
点赞 0
评论 0

服务可以看成是没有界面的 Activity,运行在后台,不可交互,不可以自己启动,要其它 的Context执行

startService() 开始服务or 执行bindService()进行绑定服务 。

一. 新建 一个服务 

服务类似一个没有界面的Activity。steps:

(1)新建 一个类,extends service 

(2)重写 Service的几个重要的方法。共6个,分别是

onCreate()  ,onDestroy()   onRebind()  onStart()  onUnbind().其中 的onBind返回的是Ibinder类型的,作用是负责 

Service与Activity的通信。

[java] view plaincopy

  1. public class MyBinder extends Binder{  

  2.     MySerivce getService(){  

  3.         return MySerivce.this;  

  4.     }  

  5. }  

  6. private final IBinder binder =new MyBinder();  

  7.   

  8. @Override  

  9. public IBinder onBind(Intent intent ) {  

  10.     // TODO Auto-generated method stub  

  11.     Log.i(TAG, "------->onBind");  

  12.     Toast.makeText(getBaseContext(), "onBind", Toast.LENGTH_SHORT).show();  

  13.     return binder;  

  14. }  

getSerivce()方法的作用是在Activity中得到Service的对象,这样 就可以操作Serivce 了。


二。使用Service

要使用Serivce还要在Manifest中注册,否则 系统 找不到service。如下,

Service与Activity平级。

[html] view plaincopy

  1. <service  

  2.             android:enabled="true"  

  3.             android:name=".MySerivce"    >  

  4.         </service>  

启动Service 有两种方法



1.ContextWrapper.startService (Intent service)

启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也

还在运行。例子:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.         public void onClick(View v) {  

  3.             // TODO Auto-generated method stub  

  4.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.             startService(i);  //start  

  6.             }  

  7.     });  

  8.       

  9.     btn2.setOnClickListener(new OnClickListener(){  

  10.         public void onClick(View v) {  

  11.             // TODO Auto-generated method stub  

  12.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  13.             stopService(i);  //stop  

  14.         }  

  15.     });  


2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)

就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的

绑定。如下 

[java] view plaincopy

  1. MySerivce mService;  //for what   

  2.       

  3.     ServiceConnection mConnection = new ServiceConnection(){  

  4.         public void onServiceConnected(ComponentName name, IBinder service) {  

  5.             // TODO Auto-generated method stub  

  6.             mService = ((MySerivce.MyBinder)service).getService();  

  7.         }  

  8.         public void onServiceDisconnected(ComponentName name) {  

  9.             // TODO Auto-generated method stub  

  10.             mService = null;  

  11.         }  

  12.     }  

[java] view plaincopy

  1.   

事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

对象 ,再用这个 对象 的getService()得到Service的操作对象 。

绑定的实现如下:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.             public void onClick(View v) {  

  3.                 // TODO Auto-generated method stub  

  4.                 Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.                 //startService(i);  //start  

  6.                 bindService(i, mConnection ,Context.BIND_AUTO_CREATE);  

  7.                 }  

  8.         });  

  9.           

  10.         btn2.setOnClickListener(new OnClickListener(){  

  11.             public void onClick(View v) {  

  12.                 // TODO Auto-generated method stub  

  13.                 //Intent i = new Intent (getBaseContext(),MySerivce.class);  

  14.                 //stopService(i);  //stop  

  15.                 unbindService(mConnection);  

  16.             }  

  17.         });  




                                 Service的生命周期

1,startService的生命周期

onCreate() ->onStart()->onDestroy() .

如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次

onCreate()。

2. bindService的生命周期

onCreate() -> onBind() -> onUnbind() -> onDestroy() 

服务 被 绑定后不能直接Destroy() ,要先onUnbind()。






1.ContextWrapper.startService (Intent service)

启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也

还在运行。例子:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.         public void onClick(View v) {  

  3.             // TODO Auto-generated method stub  

  4.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.             startService(i);  //start  

  6.             }  

  7.     });  

  8.       

  9.     btn2.setOnClickListener(new OnClickListener(){  

  10.         public void onClick(View v) {  

  11.             // TODO Auto-generated method stub  

  12.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  13.             stopService(i);  //stop  

  14.         }  

  15.     });  


2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)

就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的

绑定。如下 

[java] view plaincopy

  1. MySerivce mService;  //for what   

  2.       

  3.     ServiceConnection mConnection = new ServiceConnection(){  

  4.         public void onServiceConnected(ComponentName name, IBinder service) {  

  5.             // TODO Auto-generated method stub  

  6.             mService = ((MySerivce.MyBinder)service).getService();  

  7.         }  

  8.         public void onServiceDisconnected(ComponentName name) {  

  9.             // TODO Auto-generated method stub  

  10.             mService = null;  

  11.         }  

  12.     }  

[java] view plaincopy

  1.   

事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

对象 ,再用这个 对象 的getService()得到Service的操作对象 。

绑定的实现如下:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.             public void onClick(View v) {  

  3.                 // TODO Auto-generated method stub  

  4.                 Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.                 //startService(i);  //start  

  6.                 bindService(i, mConnection ,Context.BIND_AUTO_CREATE);  

  7.                 }  

  8.         });  

  9.           

  10.         btn2.setOnClickListener(new OnClickListener(){  

  11.             public void onClick(View v) {  

  12.                 // TODO Auto-generated method stub  

  13.                 //Intent i = new Intent (getBaseContext(),MySerivce.class);  

  14.                 //stopService(i);  //stop  

  15.                 unbindService(mConnection);  

  16.             }  

  17.         });  




                                 Service的生命周期

1,startService的生命周期

onCreate() ->onStart()->onDestroy() .

如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次

onCreate()。

2. bindService的生命周期

onCreate() -> onBind() -> onUnbind() -> onDestroy() 

服务 被 绑定后不能直接Destroy() ,要先onUnbind()。


© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 91
码字总数 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

如何启动/停止/重启MySQL

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

afriendly ⋅ 2014/03/29 ⋅ 0

Android静态安全检测 -> Service组件暴露

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

老鹰a ⋅ 2017/12/21 ⋅ 0

Google免费CDN页面加速服务使用介绍

Google PageSpeed Service是Google提供的一项免费CDN加速服务,Page Speed Service会从网站的服务器抓取内容,重写网页,再通过Google的服务器呈现给用户浏览,利用谷歌强大的服务器处理能力...

李朝强 ⋅ 2013/08/01 ⋅ 3

oracle监听器动态注册于静态注册的区别

1, oracle 10g 用netca方式建立的都默认为动态注册方式 2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SIDLISTLISTENER = (SIDLIST = (SIDDESC = (SIDNAME = PLSExtProc)...

SANSOM ⋅ 2013/11/18 ⋅ 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 ⋅ 0

android service 的各种用法(IPC、AIDL)

最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇多,在此记录一下! service的主要功能如下: a. 执行需要长时间运行的操作,这个操作不与用...

wangxigui ⋅ 2013/05/21 ⋅ 3

AngularJS Service vs Factory 总结(持续更新中...)

1.首先,看一看方法: factory: service: 2.再看看例子使用: 定义一个angular module 使用service: 使用factory: service 和 factory 定义了一个service object/function。它们都是singlet...

平江夜弹 ⋅ 2015/05/18 ⋅ 0

跟我一起学docker(14)--docker swarm的使用

1.什么是Docker Swarm? 容器集群管理工具。 通过docker swarm可以将多台机器连接在一起,通过swarm的调度可以服务的多台机器的部署,服务的伸缩。 docker-swarm的场景因为需要多台docker虚拟...

IT人故事会 ⋅ 05/12 ⋅ 0

Android service (一) startService vs bindService

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

风荷举 ⋅ 2016/06/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 47分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部