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浅见的更多相关文章

  1. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  2. 【Android开发日记】之入门篇(五)——Android四大组件之Service

    这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...

  3. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

  4. Android 四大组件之service与Broadcast

    Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...

  5. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  6. Android四大组件之一 -- Service详解

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  7. Android四大组件:Service

    前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...

  8. Android 四大组件之Service

    ---恢复内容开始--- 1,Service的生命周期

  9. 谈Android四大组件之Service篇

    Service简介 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序.Service必须在AndroidManifest.xml中声明 ...

随机推荐

  1. 破解Xshell6强制升级

    一.背景今天打开xshell时,弹出提示,“要继续使用此程序,您必须应用最新的更新或使用新版本”(如下图) 这是让我强制升级啊,点了确定按钮却提示我已经是最新版了 反正点了半天xshell也没打开.后 ...

  2. shell编程:命令替换的运用

    命令替换,有两种方式 方式一:`command` 方式二:$(command) user.sh 查找系统中所有的用户,并且输出 #!/bin/bash nginx=`netstat -tnlp | | ...

  3. python基础【第五篇】

    python第三节 1.整型及布尔值 1.1 进制转换 十进制 ----二进制 二进制 ----十进制 8421方法与普通计算 python中十进制转二进制示例:bin(51)>>> ...

  4. ASE——热身作业自我介绍

    自我介绍 大家好我是王皓,由于之前忙于保研的机试和面试导致第一次作业就拖到第二次写blog的时候才交(非常抱歉..)我喜欢玩CTF,觉得学习安全方向的知识,寻找软件或者硬件的漏洞是一件非常有意义且有趣 ...

  5. groupby 技术

    分组键可以有很多形式,且类型不必相同: 1.列表或数组,其长度与待分组的轴一样 2.表示DataFrame某个列名的值 3.字典或Series,给出待分组轴上的值与分组名之间的对应关系 4.函数,用于 ...

  6. 59. jdk1.5新特性之----增强for循环

    /*jdk1.5新特性之----增强for循环:底层是一个迭代器 作用:简化迭代器书写格式 使用范围:实现了Iterable接口的对象或者数组对象 格式:    for(变量类型  变量名 :遍历目标 ...

  7. leetcode-164周赛-1268-搜索推荐系统

    题目描述: 自己的提交: class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> ...

  8. springcloud笔记一

    微服务的概述 什么是微服务? 现今微服务界没有一个统一的.标准的定义 微服务化的核心就是将统一的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一 ...

  9. Vue学习笔记【9】——Vue指令之v-for和key属性

    迭代数组(普通数组.对象数组) <ul> <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name ...

  10. CSS Id 和 Class

    id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器.直线电机哪家好 id 选择器 id ...