什么是Service

  • “Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,服务是在后台上运行,承担着静悄悄的不为人所注意的工作。Service运行在后台,它是不可见的、无界面的程序。
  • Service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity,这个时候程序要在后台继续播放;比如检测SD卡上文件的变化;再或者在后台记录用户的地理信息位置的改变;或者启动一个服务来运行并一直监听某种动作等等。
  • Service是四大组建之一,与Activity一样需要在清单文件中注册!

Service 特性

一、 Service在后台运行,不可以与用户直接交互;
二、 长时间运行,不占程序控制权;
三、 需要通过某一个Activity或其他Context对象来启动Service。context.startService() 或 context.bindService();
四、 Service很大程度上充当了应用程序后台线程管理器的角色。(如果Activity中新开启一个线程,当该Acitivity关闭后,该线程依然在工作,但是与开启它的Activity失去联系。也就是说此时的这个线程处于失去管理的状态。但是使用Service,则可以对后台运行的线程有效地管理。

Service启动方式

一、Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行被启动的服务是由其它组件调用startService()方法而启动的,该方法会导致被启动服务的生命周期方法onStartCommand()被回调。当服务是被启动状态后,其生命周期与启动它的组件无关,即使启动服务的组件(Activity,BroadcastReceiver)已经被销毁,该服务还可以在后台无限期运行。除非调用stopSelf()或stopService()来停止该服务

二、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止绑定服务是允许其它应用程序绑定并且与之交互的Service的实现类。为了提供绑定,必须实现onBind()回调方法。该方法返回IBinder对象,它定义了服务类与Activity交互的程序接口。
Activity通过bindService()方法绑定到服务类,同时Activity必须提供ServiceConnection接口的实现类,它监视Activity与服务类之间的连接。在重写ServiceConnection接口的onServiceConnected()方法时,实现了将服务类顺利赋值到了Activity中,实现了在Activity中使用该服务类并执行其中的方法。

实现Service(start)

       import android.app.Service;
一、public class MyService extends Service {//重写里边的生命周期方法onCreate   onStart  onDestroy
}二、清单列表的application里配置<service android:name=".MyService"android:enabled="true"><intent-filter><action android:name="MYSERVICE"></action></intent-filter></service>三、Intent intent = new Intent();intent.setAction("MYSERVICE"); //添加actionintent.setPackage("com.ugrow.day02"); // 添加包名startService(intent);  //启动service四、stopService(intent);  //停止service

实现Service(bind)

一、public class MyService extends Service {public IBinder onBind(Intent intent) {Log.d("TAG","onBind");return new MyBinder();}public class MyBinder extends Binder{public MyService getService(){return MyService.this;}}//重写onDestory
}二、清单列表的application里配置<service android:name=".MyService"android:enabled="true"><intent-filter><action android:name="MYSERVICE"></action></intent-filter></service>三、        Intent intent1 = new Intent();intent1.setAction("MYSERVICE");intent1.setPackage("com.ugrow.day02"); //getPackageName()serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d("TAG","service链接成功");}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.d("TAG","service断开连接");}};bindService(intent1,serviceConnection, Service.BIND_AUTO_CREATE);四、 unbindService(serviceConnection);   

Android系统服务

Android提供大量的系统服务,这些系统服务用于完成不同的功能

获取屏幕宽高

   WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);Display defaultDisplay = wm.getDefaultDisplay();int height = defaultDisplay.getHeight();int width = defaultDisplay.getWidth();Log.d("TAG","width==="+width);Log.d("TAG","height==="+height);

NotificationManager

   public void showWeather(){NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Notification.Builder builder = new Notification.Builder(NotificationActivity.this);builder.setSmallIcon(R.mipmap.sun);//设置图标builder.setContentTitle("标题");builder.setContentText("这是内容");builder.setWhen(System.currentTimeMillis());//设置通知时间,默认为系统发出通知的时间,通常不用设置builder.setAutoCancel(true);//打开程序后图标消失Notification notification = builder.build();nm.notify(1,notification);}      Android 8.0 (API26)后新增了新增的通知渠道builder.setAutoCancel(true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//第一个参数 channelId//第二个参数 channel名字//第三个参数NotificationChannel channel = new NotificationChannel
("001","my_channel",NotificationManager.IMPORTANCE_DEFAULT);manager.createNotificationChannel(channel);builder.setChannelId("001");}

点击通知后,没有反应。

      //点击消息后的进行跳转Intent intent = new Intent(NotificationActivity.this,NotificationActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(NotificationActivity.this, 1, intent, 0);builder.setContentIntent(pendingIntent);

NotificationManager 清除消息

       nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//创建的时候 第一个参数 idnm.notify(100,notification);//清除的时候 根据创建的id进行清除  nm.cancel(100);      //清除的时候 根据创建的id进行清除  nm.cancelAll();

Service小结

  • Service提供程序的后台服务,分为本地服务和远程服务两种类型
  • 定义一个Service类需要只要继承Service类,并实现其生命周期中的方法
  • Service必须在AndroidManifest.xml配置文件中通过元素进行声明
  • Service有启动方式和绑定方式两种启动方式。
  • Service的启动方式使用Context.startService()方法来启动一个Service,调用者与- - - Service之间没有关联,即使调用者退出,Service服务依然运行
  • Service的绑定方式通过Context.bindService()来启动一个Service,调用者与Service之间绑定在一起,调用者一旦退出,Service服务也就终止使用Context.startService()方法启动的Service,通过调用Context.stopService()或Service.stopSelf()方法结束服务
  • 使用Context.bindService()绑定的Service,通过调用Context.unbindservice()解除绑定的服务
  • Android提供大量的系统服务,这些系统服务用于完成不同的功能,通过Context.getSystemService()方法可以获取不同服务管理对象
  • NotificationManager类是系统的通知服务管理类,它能够将通知Notification信息显示在状态栏上

第九章:Android开发之Service相关推荐

  1. Android开发之Service通过Messenger实现线程间的通信

    Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的.那我们现在先来看一下Messenger的使用场景.如果你需要你的Service与远程线程通信,那 ...

  2. Android开发之Service与Activity数据交互(源代码分享)

    Service想要与Activity进行数据交互,首先Activity先得绑定Service.bound service是service 的实现,它允许其他应用程序绑定到它并与之交互.要提供bound ...

  3. Android开发之Service与IntentService的区别与使用场景(源代码剖析)

    因为最大部分的service不需要同时处理多个请求(处理多个请求是一个比较危险的多线程的场景),这样在在这种情况下呢,最好使用IntentService类如果你实现你的服务. 使用intentServ ...

  4. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  5. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  6. Android开发之旅:应用程序基础及组件

    --成功属于耐得住寂寞的人,接下来几篇将讲述Android应用程序的原理及术语,可能会比较枯燥.如果能够静下心来看,相信成功将属于你. 引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android ...

  7. Android开发之旅:android架构

    引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWorld Android 开发之旅:HelloWorld项目的目录结构 我 们对android有了个大致的了解,知道如何搭建and ...

  8. android 视频开发sd卡,Android开发之SD卡文件操作分析

    本文实例讲述了Android开发之SD卡文件操作.分享给大家供大家参考,具体如下: 前面的文章中写过直接操作手机自带存储器的程序,这次就接着上次文章协议下对sd卡的文件操作.与自带存储不同的是使用sd ...

  9. Android开发之BroadcastReceiver

    Android开发之BroadcastReceiver BroadcastReceiver介绍 广播的种类 标准广播(Normal Broadcast) 有序广播(Ordered Broadcast) ...

最新文章

  1. 【Verilog HDL 训练】第 01 天
  2. Android开发学习之路-让注解帮你简化代码,彻底抛弃findViewById
  3. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
  4. 【HDOJ】3315 My Brute
  5. git 创建本地仓库、远程仓库,上传项目
  6. MapReduce操作时Error:The method setInputPaths(JobConf, String) in the type FileInputFormat is not
  7. html5 标签大写还是小写,html5中有没有规定字母标签是用大写还是小写?
  8. cout 数组_C++用指针访问数组元素(学习笔记:第6章 08)
  9. azure机器学习_Azure机器学习中的数据清理
  10. 中国女性灭菌装置行业市场供需与战略研究报告
  11. windows运行xcopy计划任务 结果是0x4解决方案
  12. 使用megacli命理查看硬raid信息
  13. java中equals重写_Java 中equals和toString()方法重写
  14. 内置式永磁同步电机IPMSM,基于虚拟信号注入法最大转矩电流比MTPA控制仿真模型
  15. CSS盒模型完整介绍
  16. 读史可以使人明智,鉴以往可以知未来
  17. 密码学的基础:X.690和对应的BER CER DER编码
  18. java 引入本地dtd,java解析xml文件读取本地dtd或者忽略dtd
  19. 桌面PDF文件名太长无法删除的问题
  20. 软件行业常用英文解释

热门文章

  1. 如何利用CRM进行规范化商机管理?
  2. 如何把自己打造成一个成功自媒体,乃至自媒体明星呢?
  3. Android模拟器超出电脑屏幕的解决方法
  4. java web前端面试题_web前端笔试试题(答案)
  5. java sax读写xml文件_使用SAXReader读取xml文件
  6. python安装失败解决办法
  7. iOS 人脸识别拾遗一 坐标转换 截取
  8. window7 + Excel 2013 安装 SQL Server 2012
  9. 连你女朋友都能看懂的分布式架构原理!
  10. 内网穿透在家远程连接公司电脑