Android中Service学习笔记

Service的基本使用方法
Service的启动方式有两种,第一种是使用startService()和stopService()方法来启动和停止Service;第二种是使用bindService()方法来绑定Service(此方法可以随时获取Service的执行状态和参数)。

1. 注意要点:

  1. startService()之后,onCreate()只执行一次,在Service没有被创建时候,执行创建。此后再运行startService()方法,都只执行onStartCommand()方法。当执行stopService()或者在Service中任何地方调用自身的stopSelf()方法后,服务将停止。此后再次调用stopService()方法,将不再起作用,也不报错。执行过程:startService()——>onCreate()——>onStartCommand()——>stopService()——>onDestory();其中startService()和stopService()在Activity()中调用的,其他为Service()里面的方法。
  2. 第二种方式是使用bindService()方法来绑定运行Service,使用unbindService()来解绑停止Service()。使用此方法更加复杂一些,bindService()参数有三个,分别为intent,serviceConnection和常数。一般需要新建一个ServiceConnection来进行连接。 此处注意: unbindService()只执行一次,解绑后再次调用unbindService()方法会报错。执行过程:bindService()——>onBind()——>onUnbind()——>unbindService()——>onDestory()。
  3. 此外,两种方式可以混合一起使用,当一起使用时,如果启动Service的方法即使用startService()用使用了bindService()那么,停止服务时也必须搭配使用stopService()和unbindService()方法。

2. service的具体实现

  • 第一步:新建一个MyService 继承Service类,并覆写onStartCommand方法。
  • 第二步:启动Service,使用startService()或者bindService()方法。
  • 第三步:调用停止Service的方法。

3. 使用bindService()方法来实现与Service()之间的通信
要实现Context与Service通信,需要使用bindService()方式启动Service()。下面以一个简单的下载服务为实例回顾一下Service()通信的具体流程。

  • 第一步:需要新建MyService()继承Service基类,覆写onBind()方法。
  • 第二步:在MyService()类中新建MyBinder内部类,继承Binder基类。在此类中定义自己的方法,此处定义两个方法:startDownload(),getProgress()方法,分别用来启动下载和获取下载进度。
  • 第三步: 在MyService()类中的onBind()方法中返回一个Mybinder类的实例。这个实例会在前台定义ServiceConnection类中的onServiceConnected中作为方法参数传递到前台。前台可以通过此类对象调用MyBinder类中的方法。
  • 第四步:在前台首先定义一个ServiceConnection类,覆写onServiceConnected()方法,在此方法中获取实例MyBinder类实例,并调用它的.startDownload()和.getProgress()方法。
  • 第五步:调用bindService()方法,传递参数为intent,connection,BIND_AUTO_CREATE 。且解绑参数是传递ServiceConnection实例即可。

以下为代码实例:
MyService.class

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;public class MyService2 extends Service {public MyService2() {}class MyBinder extends Binder {//定义两个方法,会传递到前台被调用public void startDownload() {//开启下载}public int getProgress() {return 0;}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//此方法里面是使用startService()方法之后执行的,且不做交互return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}
}

Main2Activity.class

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;public class Main2Activity extends AppCompatActivity {private Button mButton;private Button mStopService;private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {MyService2.MyBinder mBinder = (MyService2.MyBinder) iBinder;mBinder.startDownload();mBinder.getProgress();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {//断开连接,回收资源}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);mButton = (Button) findViewById(R.id.start_service);mStopService = (Button) findViewById(R.id.stop_service);mButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//绑定Service()Intent intent = new Intent(getApplication(), MyService2.class);bindService(intent, mConnection, BIND_AUTO_CREATE);}});mStopService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {unbindService(mConnection);     //解绑,直接传递ServiceConnection即可,不必要传递Intent}});}
}

接下来,我们学习了前台服务。前台服务和后台服务相比,优先级更高,不易于被系统回收而杀死。前台服务的一个特点就是,在手机通知栏会显示一个服务的通知,像音乐播放器、下载进度等。下面来学习一个简单的前台服务。

4. 前台服务
只需要将一个Activity绑定到一个Service中就可以得到前台服务。新建Intent,将Intent放入PendingIntent中,然后新建Notification notification=new NotificationCompat.Builder(this).set()….setContentIntent(pi)等参数。之后使用startForeground(1,notification)方式启动即可。

5. IntentService介绍
我们一般使用Service,都需要做一些耗时任务。然而Service也是运行在UI线程里面的,因此一般需要在Service里面开启线程。然而,很多时候,我们开启线程之后,很容易忘记去关闭线程,而且使用起来也比较麻烦。所以Android推出了IntentService类,继承的Service。主要是用来结果我们这个问题的。
IntentService中自带有一个抽象方法需要覆写onHandIntent()方法,此方法都是执行在子线程中的,且代码执行完后会自动结束。这些是IntentService底层封装好的。
注意: 在调用startService(IntentService)后,onHandIntent()会执行多次,以消息队列的方式依次执行。

Service和IntentService基础就介绍到这里,下面通过一个具体的下载实例来复习和巩固知识点。

《Android 第一行代码》十一章 Service学习笔记相关推荐

  1. 第一行代码十一章:(基于位置的服务) 3C-58-C2-5D-F8-FE

    基于位置的服务 1.申请API 2.使用百度定位 3.在手机上出现自己的位置 1.申请API 在做位置服务时需要申请属于自己的API,所以必须要先成为一个百度开发者,注册的网址如下:hppt//:de ...

  2. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  3. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  4. Android第一行代码-Activity

    文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...

  5. Android第一行代码(第一行代码、活动)

    一.第一行代码 1.了解全貌 1.1Android的系统架构 Android的系统架构:Linux内核层.系统运行库层.应用框架层和应用层 1.Linux内核层 Android系统是基于Linux内核 ...

  6. 《第一行代码》12.2学习中遇到的一些问题and心得

    1.书中P411中的activity_main.xml中的Toolbar不应该使用<android.support.v7.widget.Toolbar/> 应该使用<androidx ...

  7. Handler内存泄漏问题解决方案(Android,第一行代码,This Handler class should be static or leaks might occur)

    1 问题背景 博主最近在复习<第一行代码>的第10.2.2章节--在子线程中更新UI,书中给出的在UI主线程中用匿名内部类实现Handler的写法如下: private Handler h ...

  8. Android第一行代码——第三章:控件的使用方法5A-00-1A-C4-8C-55(2009+jjy)

    标题:这章主要学习如何控件的使用方法 1 TextView. 创建activity_main.xml中的代码 代码如下: <?xml version="1.0" encodi ...

  9. 《第一行代码》第三版笔记

    文章目录 第一章 1.3.5 详解项目中的资源 1.3.6 详解build.gradle文件 第二章 2.1 kotlin语言简介 2.2 如何运行kotlin代码 2.7.2 判空辅助工具 第三章 ...

最新文章

  1. poj1625Censored!(AC自动机+dp)
  2. 如何用python的i2c教程_使用Raspberry pi3(Python)的I2C用法
  3. Python:自动化上传OSS
  4. php 8 jit,深入理解PHP8 JIT
  5. kubeadm reset后安装遇到的错误:Unable to connect to the server: x509: certificate signed by unknown authority
  6. 8g内存一般占用多少_手记|如何设置虚拟内存
  7. win主机ping不通linux的IP
  8. Hibernate 笔记4 实现对数据库的增删改查
  9. Sharepoint学习笔记—Ribbon系列
  10. Ubuntu linux 查看串口连接信息
  11. 怎么知道eclipse的workspace的路径
  12. ubuntu16.04 TLS安装java
  13. vue使用el组件 在el-tabs中 刷新页面保持不变
  14. HashSet中add的执行过程
  15. vue获取client为0_vue document.documentElement.clientHeight为0
  16. 支付宝小程序平台的IM聊天插件
  17. Layui Select四级联动效果触发
  18. JAVA----JSON序列化错误:InvalidDefinitionException: No serializer found for class org.apache.ibatis.execut
  19. 6条开会清单,教你组织一场高效会议!
  20. 国产系统中标麒麟安装教程

热门文章

  1. PR视频剪辑中如何制作抖音上的竖屏且添加模糊的视频效果
  2. 医疗传感器应用现状及设计挑战
  3. Express基础使用
  4. cisco认证考试信息网站
  5. 裸聊网站108亿条数据泄露,中国53万老哥有点慌
  6. TiDB和MySQL的锁一些分析比对
  7. mkdir: 无法创建目录kk: 只读文件系统
  8. jaca和mysql外卖系统_Maven+springmvc+spring+mybatis+mysql+dubbo+redis高仿饿了吗外卖点餐系统...
  9. python函数递归法求一个数各位数之和_Python基础之内置函数和递归
  10. 禁用Mac SIP – System Integrity Protection