首页 > 其他分享 >Android学习笔记(五二):服务Service(中)- 继承Service类

Android学习笔记(五二):服务Service(中)- 继承Service类

时间:2023-04-09 11:31:37浏览次数:39  
标签:服务 Service EXTRA void 五二 Intent Android public


通过IntentService的继承类实现命令触发的服务,也可以直接通过Service的继承类来实现。在IntentService中的例子,我们增加了StopService( )的方式,用于试验。在实际应用中,IntentService常用于一次性运行,自动结束的情况,不需要人工停止干预。对于需要人工干预的停止的,长时间(或无限制)运行的情况,可直接继承Service的方式,例如音乐播放。IntentService也是Service的一个继承类。

继承Service类

在本例中,我们中我们模拟音乐播放,提供了两个参数,一个是音乐列表,一个是无序播放标识。

和上一例子不同,Service不会自动结束,必须要用户干预。例如播放音乐或者audiobook,当用户离开Appcliation时,音乐还能继续播放,service会持续下去,不停止,直至用户主动停止服务,即使音乐播放完毕,模式也非循环播放,当播放完所有音乐时,service仍然存在,直至用户主导stopService()或者服务本身stopSelf()。例子是个模拟例子,不涉及真正的音乐播放。

客户端代码

public class ServiceTest2 extends Activity{  
     ... ...  
     //对于客户端,和上次例子相似,通过Intent作为命令,本例传递的参数为两个,通过startService()来启动服务。 
     private void startPlayer(){ 
         Intent i = new Intent(this,ServicePlayer.class);         i.putExtra(ServicePlayer.EXTRA_PLAYLIST, "playlist");
         i.putExtra(ServicePlayer.EXTRA_SHUFFLE, true); 
         startService(i); 
     } 
    //有用户干预的停止服务。在例子中,我们并不使用创建服务的intent,因为Activity的生命周期可能已经结束,intent已被垃圾回收,我们重新开启Activity,在新的Activity中,不需开启服务就可直接停止。 
     private void stopPlayer(){ 
        stopService(new Intent(this,ServicePlayer.class));     } 
 }

Service端代码


Android学习笔记(五二):服务Service(中)- 继承Service类_class

public class ServicePlayer extends Service{
    public static final String EXTRA_PLAYLIST = "com.wei.android.learning.EXTRA_PLAYLIST";
     public static final String EXTRA_SHUFFLE = "com.wei.android.learning.EXTRA_SHUFFLE";
     private boolean isPlaying = false;  
     //将在以后学习Bind Service的模式 
     public IBinder onBind(Intent arg0) {  
         return null; 
     } 
    //收到客户端触发,如果服务尚未启动,则先执行onCreate(),再此进行服务初始化处理。     public void onCreate() { 
         super.onCreate(); 
     }  
     //在收到stopService()时触发,我们将在此处理停止Service的相关事宜,例如停止后台线程的运行等等。 
     public void onDestroy() {  
         playStop(); 
         super.onDestroy(); 
     }  
     //当系统内存少时,将要求终止服务,我们在此进行关闭服务的处理,例如保持相关的状态等,如服务部需保持特定状态,则无需重写此方法。  
     public void onLowMemory() {  
         super.onLowMemory(); 
     }   
    //收到客户端请求时触发,由于onStartCommand()运行在主线程,将进行本次服务的初始化,并开启后台线程运行相关的处理,具体参加线程的学习笔记,本例只考察Service相关内容。返回值将告诉系统如果service的进程被杀掉,将会如何:START_STICKY表示服务将回到开始状态,如同onStartCommand()被called,但是Intent不会重发;START_REDELIVER_INTENT表示要求系统重新发送一次Intent,即服务将重新触发执行onStartCommand();START_NOT_STICKY表示无需干预,服务停止,等待有新的命令触发。
     public int onStartCommand(Intent intent, int flags, int startId)  {  
         showInfo("onStartCommand"); 
         String playlist = intent.getStringExtra(EXTRA_PLAYLIST); 
         boolean suffle = intent.getBooleanExtra(EXTRA_SHUFFLE, false); 
        playStart(playlist,suffle); 
         return START_NOT_STICKY; 
     }  
    private void playStart(String playlist, boolean suffle){
         if(! isPlaying){  
             isPlaying = true; 
         } 
     }  
     private void  playStop(){ 
         if( isPlaying){ 
             showInfo("Go to Stop!"); 
             isPlaying = false; 
         } 
     } 
 }


如果有三个客户端都通过startService(),也只会启动一个服务。只有第一个发出命令时,系统发现服务没有启动,将启动服务,其余的直接触发onStartCommand()。通过startService()并不仅仅是发送命令,而是告诉系统服务维持运行,直至通知它服务停止。


标签:服务,Service,EXTRA,void,五二,Intent,Android,public
From: https://blog.51cto.com/u_9877302/6178717

相关文章

  • android沉浸状态栏+导航栏(小白条) 小白教程 (基于安卓官方教程)
    沉浸状态栏+导航栏(小白条)是基本操作,但是网上的很多教程都是错误的...,安卓官方的教程对小白很不友好,所以记录下我的实现过程供大家参考。前置知识状态栏是屏幕顶部显示时间、通知图标等等的地方导航栏就是屏幕下方用于提供返回,返回桌面,进入多任务界面的的三个按键或着小白条......
  • SAP ABAP Gateway 系统里 HTTP 请求响应头部字段 DataServiceVersion 的可能取值范围
    SAPABAPGateway系统里HTTP请求的响应头部字段集合里,DataServiceVersion这个字段的作用是什么,包含哪些可能的值?如下图第178行代码所示。在SAPABAPGateway系统中,DataServiceVersion是HTTP响应头部字段集合中的一个字段,用于指定OData服务的版本信息。具体来说,Da......
  • AndroidBanner - ViewPager 03
    AndroidBanner-ViewPager03上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题:当banner不可见的时候,也需要停止轮播给banner设置点击事件,长时间的触摸也会被默认是一个点击事件这篇文章就来解决这些问题,并处理一下banner的......
  • 马哥课程回顾-----service
    1、podip经常变化,service是pod的代理,客户端访问service就会把请求代理到pod;2、podip在k8s集群之外无法访问,service可以在k8s集群之外访问。service依赖域名解析的Coredns组件的。kube-proxy监测到Service变化转换成iptables或者ipvs规则。service通过标签选择器找到......
  • Android如何适配不同屏幕的手机
    在Android中,要适配不同屏幕的手机,需要考虑以下几个方面:分辨率适配:不同手机的屏幕分辨率不同,为了保证UI在不同手机上的显示效果一致,需要使用不同的布局文件或者使用自适应布局。屏幕密度适配:不同手机的屏幕密度也不同,为了保证UI在不同手机上的显示效果一致,需要使用不同......
  • Android HAL机制的深入理解及在Linux上移植和运行的一个好玩的HAL小例子
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  Ubuntu18.04.x前言  近一年来,虽然还是做的是AIOT相关的事情,但是某些事情却发生了一些变化。随着个人的阅历提升,现在的AI在边缘端部署已经不局限于......
  • 在android的fragment中使用子线程查询的数据如何实时更新在主界面的listview中
    主要是使用handler来对ui界面进行实时更新 public class YourFragment extends Fragment {    private ListView mListView;    private YourAdapter mAdapter = new YourAdapter(getContext(), new ArrayList<YourData>());//注意这一步的初始化如果闪......
  • Android性能优化
     在如今的移动互联网时代,移动设备的使用越来越普遍,而Android作为一个开放、免费的操作系统,更是占据了全球智能手机市场的绝大部分份额。然而,Android设备的性能问题也是使用者非常关心的问题,因此,Android性能优化也是开发者不得不重视的问题。Android应用的性能问题主要体现......
  • sonar扫描kotlin 代码报错 Cannot analyse 'XXXXServiceImpl.kt' with 'KtChecksVisit
    问题现象://sonar扫描控制台报错,有可能会导致代码覆盖率等指标不准确16:56:47.623ERROR:Cannotanalyse'XXXXServiceImpl.kt'with'KtChecksVisitor':nulljava.lang.NullPointerException:nullatorg.sonarsource.kotlin.checks.ConditionalStructure.<init&......
  • Linux服务管理命令service与systemctl
    历史背景Linux系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。历史版本中的linux对服务的操作是通过service来完成的。若创建用户自定义的服务,则需要较为复杂的操作。目前linux新的发行版已经内置了systemctl来操作服务。在早期服务管......