定义一个服务

我们来看下怎么在项目中定义一个服务,新建一个项目,右击包名,我这里的包名是com.example.lenovo.servicetest,然后选择New—>Service—>Service,会弹出如下所示的窗口:

可以看到,我将服务命名为MyService,Exported属性表示是否允许除了当前程序之外的其他程序访问这个服务,Enabled属性表示是否启用这个服务。将两个属性都勾中,点击Finish完成创建。

创建好之后,MyService中的代码,如下所示:

public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}
}

既然定义了一个服务,那么应该在服务中去处理一些事情,处理事情的逻辑应该写在哪?现在我们可以重写Service中的另外一些方法了,如下所示:

public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();}
}

这里我重写了3个方法,分别是onCreate()、onStartCommand()和onDestroy(),这3个方法是服务中最常用到的3个方法。这3个方法分别在什么时候调用:

onCreate():在服务创建的时候调用
onStartCommand(): 在每次服务启动的时候调用
onDestroy():在服务销毁的时候调用

另外需要注意一下:每个服务都要在AndroidManifest.xml文件中进行注册才能生效,这是Android四大组件共有的特点,不过AndroidStudio已经自动帮我们注册好了,就像新建活动的时候一样,自动帮我们注册好。打开AndroidManifest.xml文件看下,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lenovo.servicetest"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">............<serviceandroid:name=".MyService"android:enabled="true"android:exported="true"></service></application></manifest>

现在这个服务就定义好了。

启动和停止服务

我们来通过一个具体的例子来了解一下怎么启动和停止一个服务,上面我们已经定义好了一个名为MyService的服务,下面我们来启动和停止这个服务。

MainActivity的布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/btn_start_service"android:text="开启服务"android:textSize="20sp"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/btn_stop_service"android:text="停止服务"android:textSize="20sp"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

布局这里就是两个按钮,分别用于启动服务和停止服务。

MainActivity的java代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_startService;private Button btn_stopService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_startService = findViewById(R.id.btn_start_service);btn_stopService = findViewById(R.id.btn_stop_service);btn_startService.setOnClickListener(this);btn_stopService.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_start_service:Intent startIntent = new Intent(this, MyService.class);startService(startIntent);  // 启动服务break;case R.id.btn_stop_service:Intent stopIntent = new Intent(this, MyService.class);stopService(stopIntent);  // 停止服务break;}}
}

可以看到,我们这里是借助Intent来实现启动和停止服务,具体是调用startService()方法和stopService()方法来启动和停止服务,但这两个方法都是Context类中的,注意:这里完全是由活动来决定服务何时停止,如果不在活动中呢?那服务有没有什么办法让自己停下来呢?只需要在MyService的任何一个位置调用stopSelf()方法就能让这个服务停止下来了。

接下来又有一个问题,我们如何知道服务已经成功启动或者停止了呢?最简单的方式就是在MyService的几个方法中加入打印日志,如下所示:

public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onCreate() {super.onCreate();Log.d("MyService", "onCreate executed");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("MyService", "onStartCommand executed");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.d("MyService", "onDestroy executed");}
}

好了,现在来运行一下程序,我点击3下开启服务和一下停止服务,日志的效果图如下:

此处可以看到,onStartCommand()方法执行了3次,而onCreate()方法只执行了一次,因为在第一次点击开启服务按钮的时候,此时的服务是没有创建的,所以会同时调用onCreate()方法和onStartCommand(),而后面的2次点击开启服务按钮,此时服务已经创建好了,自然不会在调用onCreate()方法了,所以会调用2次onStartCommand()方法。

除了通过打印日志的方法观察服务的开启和停止,我们也可以通过点击手机设置来进行观察,效果图如下:

服务开启状态下的截图

服务停止状态下的截图

服务的基本使用:定义、启动和停止服务相关推荐

  1. centos终止linux程序,CentOS启动和停止服务详解

    CAMS 在安装过程中, 1. 添加服务 添加服务的步骤为: (1) 将该服务的脚本文件拷入/etc/rc.d/init.d 文件夹下,例如: service camsd stop 停止 camsd ...

  2. [转]使用批处理设置、启动和停止服务

    使用批处理设置.启动和停止服务                                                              Pashine     当我们的电脑安装了数据 ...

  3. oracle如何启动和停止服务,CentOS启动和停止服务详解

    CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...

  4. 安卓案例:启动和停止服务

    安卓案例:启动和停止服务 一.服务(Service) Service生命力顽强,它有两方面的作用:后台运行.跨进程访问.学习Service基础,利用它可以在后台完成一些耗时的工作,比如网络连接.下载数 ...

  5. 使用批处理设置、启动和停止服务

    使用批处理设置.启动和停止服务                                                              Pashine     当我们的电脑安装了数据 ...

  6. 批处理启动和停止服务

    使用批处理设置.启动和停止服务 当电脑安装了数据库服务(如,Oracle.SQLServer)或一些web服务(如IIS,tomcat)时,系统会添加很多服务(services)项.而这些服务往往是占 ...

  7. 停止计算机sql服务,SQL Server启动和停止服务的三种方法

    一.为什么要启动SQL Server服务? 1.如果你不开启服务,去连接数据会出现报错信息 2.因为不连接到服务器,就对数据库操作不了 二.启动SQL Server的三种方法 第一种:后台启动服务 * ...

  8. springboot 脚本启动、停止服务

    启动服务:#!/bin/bash CPU_COUNT=`cat /proc/cpuinfo | grep processor | wc -l`MEM_OPTS="-Xms1024m -Xmx ...

  9. centos7重新加载服务的命令_CentOS7 从查看、启动、停止服务说起systemctl

    执行命令"systemctl status 服务名.service"可查看服务的运行状态,其中服务名后的.service 可以省略,这是CenOS7以后采用systemd作为初始化 ...

最新文章

  1. NAR:宏基因组网络分析工具MetagenoNets
  2. 真我闪博,闪靓自我!
  3. 洛谷-P3396 哈希冲突 分块
  4. 生活之难:生活到底难在哪里
  5. Java 设计模式 之 工厂方法模式、抽象工厂模式
  6. 2005/2010/2015-2021年全国兴趣点POI数据
  7. 在屏幕中间分别显示绿色、绿低红色、白底蓝色的字符串'welcome to masm!'
  8. Helix QAC/QAC++ — 软件静态测试工具
  9. SPSS如何计算Cronbach alpha和进行折半信度检验
  10. 共模信号 差模信号 差动放大器
  11. 邮件中的 请看附件 请知悉,英语怎么说 要比较正式的用语
  12. 基于负熵的快速不动点算法
  13. 飞卡日常进度之K60DN/K60FX/K66对比
  14. Invalid bound statement (not found): com.sxt.sys.mapper.MenuMapper.insert
  15. sqlserver 导入导出数据向导
  16. 吉林大学计算机系高级语言程序设计(C语言)期末题目及解答(上)
  17. 路由器和交换机有什么区别
  18. Linux文件查找的4个命令
  19. day1——SpringBoot介绍
  20. 谈一谈|如何理解马云4月14日再谈996

热门文章

  1. 20190915,我努力奔跑,只为追上那个曾经被寄予厚望的自己
  2. 跟着瑜伽老师一节课程序员锻炼身体
  3. 初步浅谈 celery
  4. matlab中关于fix(x),floor(x),ceil(x)的区别
  5. 基于jQuery的软键盘
  6. 蛋花花:人工智能在逼问我们一个问题
  7. 中国的软件流氓行为何时了?搜狐输入法竟然自动下载并要求我安装浏览器!!...
  8. 什么是噪声温度?-174dBm/Hz又是什么?
  9. 【pwn】攻防世界 pwn新手区wp
  10. 【obs】项目构建环境