Android四大组件之Service浅见
Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行。还有一个作用是通过AIDL来实现进程间通信。
Service的启动方式
Service的启动方式有两种,startService()与bindService()
startService():onCreate->onStartCommand(旧版本为onStart),结束通过stopService(),回调onDestroy
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStartCommand()方法
bindService():onCreate->onBind,结束通过unBindService(),回调onUnbind->onDestroy.
第一种方式启动Service,Service与调用者没有关联,调用者,比如Activity,finish掉后,Service还在运行。而bind就是两者绑定到一起,调用者结束了,Service也会结束。当然,调用者也可以通过unbindService()直接解绑。
Service与Thread
很多人搞不懂Service和Thread的区别,这里我谈谈我的理解。Service大家可以理解成没有界面的Activity,他运行在主线程(UI线程)中,而不是另起一个线程,所以说为什么不能在onStart(),onCreate()里进行耗时的操作,因为会阻塞主线程,甚至会引起ANR异常。通常在Service里进行耗时操作时都需要在Service中另起一个线程。同时,Service又分为local Service 和 remote Service ,分别为本地服务和远程服务。
本地服务:在当前进程的主线程中,即与Client在同一进程,同时他是在运行UI线程上
远程服务:另起一个进程,注意,是进程,不是线程。运行在该进程的主线程上。常用于进程间通信。
可以通过添加android:process="remote"代码将Service设置成remote Service(默认是local)
至于Thread就不用介绍了,所以大家可以看出来Service从某个层面上说,与Thread半毛钱关系没有。
那么为什么要引进local Service呢,为什么不直接使用Thread呢?我的理解是local Service能够更加方便地对Thread进行管理和维护,比如如果你在当前Activity start一个子线程,当你离开这个Activity时,你将失去这个子线程的引用。而无论你Activity如何跳转,Service都可以安然地对子线程进行维护。
Service通信
Service 通过IBinder进行通信,首先创建内部类MyBinder继承实现IBinder接口的Binder类。重写onBind()方法返回MyBinder实例。
public class MyService extends Service {
private int count;
private boolean quit;
private MyBinder binder = new MyBinder();
class MyBinder extends Binder{
public int getCount(){
return count;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onbind");
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("Create");
new Thread(){
@Override
public void run() {
while(!quit){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
count++;
}
}
}.start();
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("unbind");
return true;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
this.quit = true;
System.out.println("destroy");
}
}
在调用Service的Activity中创建ServiceConnection实例,重写onServiceConnected,获取IBinder对象
private ServiceConnection conn = new ServiceConnection() {
//在Service连接失败时会调用该方法
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("discouted");
}
//连接成功会调用该方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
binder = (MyBinder) service;
}
};
调用bindService(Intent service, ServiceConnection conn, int flags)时传入第二个参数就是ServiceConnection实例。获得IBinder对象后就可以调用里面的方法。
Android四大组件之Service浅见的更多相关文章
- Android四大组件之Service
Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...
- 【Android开发日记】之入门篇(五)——Android四大组件之Service
这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...
- Android成长日记-Android四大组件之Service组件的学习
1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...
- Android 四大组件之service与Broadcast
Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...
- Android四大组件之一Service介绍-android学习之旅(十二)
基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...
- Android四大组件之一 -- Service详解
相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...
- Android四大组件:Service
前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...
- Android 四大组件之Service
---恢复内容开始--- 1,Service的生命周期
- 谈Android四大组件之Service篇
Service简介 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序.Service必须在AndroidManifest.xml中声明 ...
随机推荐
- 清除浮动最有效的css写法
说起来呢,基本上只要你给容器div加了float的属性,就需要清除浮动来使页面显示正常,那么,到底有什么方法可以让浮动轻松清除呢? 可以用display:flex;替代,但是它对IE8,9支持不是很好 ...
- vCenter 6.0 如何用client登录
使用Vmware client 输入vCenter的IP地址 然后用户名使用administrator@vsphere.local 再输入密码,即可登录vCenter了. web端也是一样,但是我遇 ...
- Spring集成RMI实现远程调用
前提: 1.开发工具: jdk tomcat ecplise,开发工具的使用本篇不做介绍. 2.需具备以下知识:javase servelt web rmi spring maven 一.关于RMI ...
- 【扯淡篇】SDOI2018丶一轮游丶记
--某不知名蒟蒻的SDOI2018 R1退役场游记&&OI生涯总结 真的是混不下去了. 进队是不可能的, 进队是不可能进队的. 这辈子不可能进队的. 刷题又不会刷 就是靠打表找规律这种 ...
- ajax请求的原生js实现
我们使用ajax请求一般都用的jQuery, axios封装好了的api, 那么如果只能用原生js, 我们该如何操作了? 上代码. 我们在同目录下写好一个json文件(data.json)用于请求测试 ...
- js 实现 间隙滚动效果
代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- 【TJOI2018】教科书般的亵渎
题面 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\),且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成11点伤 ...
- linux上文件内容去重的问题uniq/awk 正则表达过滤操作
.uniq:只会对相邻的行进行判断是否重复,不能全文本进行搜索是否重复,所以往往跟sort结合使用. 例子1: [root@aaa01 ~]# cat a.txt 12 34 56 12 [root@ ...
- 阿里linux-Centos各版本下载
https://mirrors.aliyun.com/centos/7/isos/x86_64/ Index of /centos/7/isos/x86_64/ ../ 0_README.txt 16 ...
- 58. jdk1.5新特性之静态导入
jdk1.5新特性之--------静态导入 作用:简化书写(在我们使用静态方法的时候要用 类名.方法名的方式调用.而用静态导入只需要写方法名就可以调用) 语法: 1.作用于一个方法: ...