服务初体验 xunaa 2024-10-08 00:18:35 编辑说 1. 线程相关概念 在开始学习Service之前,我们先来了解一下线程的一些概念! 1)相关概念: 程序:为了完成特定任务而用某种语言编写的一组指令(一组静态代码)。进程:运行的程序,系统调度 1. 线程相关概念 在开始学习Service之前,我们先来了解一下线程的一些概念! 1)相关概念: 程序:为了完成特定任务而用某种语言编写的一组指令(一组静态代码)。进程:运行的程序,系统调度和资源分配的独立单位。操作系统会给每个进程分配一段内存。空间!程序是动态顺序执行的,经历了代码加载、执行、完成的完整过程!线程:比进程更小的执行单元。每个进程可以有多个线程。线程需要放置在进程中才能执行。线程是由程序管理的,而进程是由系统调度的!多线程的理解:并行执行多条指令,根据调度算法为每个线程分配CPU时间片。它实际上是分时执行的,只不过切换时间很短,用户感觉是‘同时’! 2)线程的生命周期: 3)创建线程的三种方式: 继承Thread类实现Runnable接口并实现Callable接口。如果你使用的是2创建的线程,你可以直接像这样启动它:new Thread(myThread).start();更多时候,我们喜欢使用匿名类,即如下的写法: new Thread(new Runnable(){public void run();}).start(); 2.Service和Thread线程的区别 其实两者之间并没有太大的关系,但是很多朋友经常将两者混淆! Thread就是线程,程序执行的最小单位,也是CPU分配的基本单位! Service是Android提供的一个组件,可以让其长期驻留在后台。最常见的用法是执行轮询操作!或者您想在后台执行某些操作,例如在后台下载更新!记住不要混淆这两个概念! 3.服务生命周期图 4.生命周期分析 好了,从上图的生命周期我们可以知道,Android中Service的使用有两种方式: 1)StartService()启动Service 2)BindService()启动Service PS:还有一个办法,就是启动Service后绑定Service! 1)相关方法详解: onCreate():该方法在Service第一次创建后立即回调。该方法在整个生命周期中只会被调用一次! onDestory():当Service关闭时会回调该方法。该方法只会回调一次! onStartCommand(intent,flag,startId):早期版本是onStart(intent,startId),当客户端调用startService(Intent)方法时会回调。 StartService方法可以被多次调用,但是不会创建新的Service对象。它继续复用之前生成的Service对象,但是会继续回调onStartCommand()方法! IBinder onOnbind(intent):该方法是所有Services都必须实现的方法。该方法将返回一个IBinder对象,应用程序通过该对象与Service组件进行通信! onUnbind(intent):当所有绑定到Service的客户端都断开连接时,会回调该方法! 2)StartService启动Service 第一次启动时,会创建一个Service实例,并依次调用onCreate()和onStartCommand()方法。此时Service就会进入运行状态。如果再次调用StartService来启动Service,则不会创建新的Service对象,系统会直接复用之前的Service对象。创建Service 对象并调用其onStartCommand() 方法! 但这样的Service与其调用者没有必然联系。也就是说,当调用者结束生命周期时,只要不调用stopService,Service仍然会继续运行! 无论Service启动多少次,只需要调用一次StopService即可停止Service。 3)BindService启动Service 当第一次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法。然后调用者就可以通过IBinder与Service进行交互。如果以后再次使用bindService,当指定Service时,系统不会创建新的Service实例,也不会再次调用onBind()方法。它只会直接将IBinder对象传递给后面添加的其他客户端! 如果我们解除服务绑定,只需要调用unbindService()即可。这时候就会调用onUnbind和onDestory方法!这是一个客户的情况。如果多个客户端绑定了同一个Service,情况如下:当客户端完成与服务的交互后,调用unbindService()方法解除绑定。当所有客户端都解除与服务的绑定时,系统将销毁该服务。 (除非服务也是通过startService()方法启动的) 另外,与上面的情况不同,bindService模式下的Service是与调用者相关的。可以理解为“绳子上的蚱蜢”。他们会一起死去。在bindService之后,一旦调用者被销毁,那么Service也立即终止! 通过BindService调用Service时调用Context的bindService分析bindService(Intent Service,ServiceConnection conn,int flags) service: 指定通过该intent要启动的Service conn:ServiceConnection 对象,用户监听访问者与Service之间的连接。如果连接成功,则回调该对象中的onServiceConnected(ComponentName,IBinder)方法;如果本服务所在主机因异常终止或其他原因终止,本服务与访问者之间的连接将被断开。当调用onServiceDisconnected(CompanentName)方法时,通过unBindService()方法主动断开连接将不会调用上述方法! flags: 指定绑定时是否自动创建Service(如果Service还没有创建),参数可以为0(不自动创建)、BIND_AUTO_CREATE(自动创建) 4)StartService启动Service,然后bindService。 如果Service已被某个客户端通过StartService()启动,则另一个客户端调用bindService()绑定该Service,然后调用unbindService()解除绑定,最后调用bindService()绑定该Service。此时触发的生命周期方法如下: onCreate()-onStartCommand()-onBind()-onUnbind()-onRebind() PS: 前提是:onUnbind()方法返回true!说到这里,有些读者可能会感到困惑。 Service 调用unbindService 后不应该调用onDistory() 方法吗?其实这是因为这个Service是由我们的StartService启动的,所以如果调用onUnbind()方法解除绑定,这个Service并不会终止! 结论: 如果我们使用bindService绑定一个已启动的Service,请注意它是一个已经启动的Service!系统只将Service内部的IBinder对象传递给Activity,并不将Service的生命周期与Activity进行绑定。所以当调用unBindService()方法解除绑定时,Service并不会被销毁! 5、生命周期验证 接下来我们编写代码来验证生命周期: 1)验证StartService启动Service的调用顺序 首先我们自定义一个Service,并重写相关方法。用户在logcat上打印验证: 测试服务1.java 公共类TestService1 扩展服务{ 私有最终字符串标记='TestService1'; //必须实现的方法 @覆盖 公共IBinder onBind(Intent 意图) { Log.i(TAG, 'onBind方法被调用!'); 返回空值; } //Service创建时调用 @覆盖 公共无效onCreate() { Log.i(TAG, 'onCreate方法被调用!'); super.onCreate(); } //Service启动时调用 @覆盖 公共int onStartCommand(Intent意图,int标志,int startId){ Log.i(TAG, 'onStartCommand方法被调用!'); 返回super.onStartCommand(intent, flags, startId); } //Service关闭前的回调 @覆盖 公共无效onDestroy(){ Log.i(TAG, 'onDestory 方法被调用!'); super.onDestroy(); } } AndroidManifest.xml完成Service注册 !-- 配置Service组件,同时配置一个action -- 服务android:name='.TestService1' 意图过滤器 动作android:name='com.jay.example.service.TEST_SERVICE1'/ /意图过滤器 /服务 接下来是简单的布局文件,两个按钮,最后是MainActivity的编写,在按钮的点击事件中分别调用startService()和stopService()! 公共类MainActivity 扩展Activity { 私有按钮启动; 私人按钮停止; @覆盖 protected void onCreate(Bundle savingInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 开始=(按钮) findViewById(R.id.btnstart); stop=(Button) findViewById(R.id.btnstop); //创建启动Service的Intent,以及Intent属性 最终意图意图=新意图(); intent.setAction('com.jay.example.service.TEST_SERVICE1'); //设置两个按钮的点击事件,分别是启动和停止服务。 start.setOnClickListener(new OnClickListener() { @覆盖 公共无效onClick(查看v){ 启动服务(意图); } }); stop.setOnClickListener(new OnClickListener() { @覆盖 公共无效onClick(查看v){ 停止服务(意图); } }); } } 运行截图: 点击启动服务: 吃饱了没事干,请多点: 最后点击停止服务: 结果分析: 从上面的运行结果,我们可以验证我们的生命周期图中所解释的内容。 我们发现onBind() 方法没有被调用。另外,多次点击启动Service只会重复调用onStartCommand方法!无论我们启动Service多少次,stopService都会停止Service! 2)验证BindService启动Service的顺序: 在开始讲写代码之前,我们首先需要先了解一些东西: 首先是下面第一张大图给出的Context的bindService方法: ServiceConnection对象:监视访问者和服务之间的连接。如果连接成功,则会回调onServiceConnected()。如果Service由于异常终止或者其他原因与访问者断开连接,则会回调onServiceDisconnected方法。调用unBindService()不会调用该方法。方法! onServiceConnected方法中有一个IBinder对象,可以实现与绑定的Service通信!我们在开发Service类的时候,默认需要实现IBinder的onBind()方法,该方法返回的IBinder对象会被传递给ServiceConnection对象中的onServiceConnected参数,我们就可以通过这个IBinder与Service进行通信这里!概括: 步骤1: 继承自定义Service中的Binder,实现自己的IBinder对象 步骤2:通过onBind()方法返回自己的IBinder对象 步骤3: 在绑定Service的类中定义一个ServiceConnection对象,并重写onServiceConnected和onDisconnected两个方法!然后直接读取IBinder传递过来的参数! 好了,接下来就是编写代码并验证了。这里我们定义一个Service用于计时,然后演示BindService的使用以及方法调用过程!代码比较简单,我就不解释了! 测试服务2.java: 公共类TestService2 扩展服务{ 私有最终字符串标记='TestService2'; 私有整数计数; 私人布尔退出; //定义onBinder方法返回的对象 私有MyBinder 活页夹=new MyBinder(); 公共类MyBinder 扩展了Binder { 公共int getCount() { 返回计数; } } //必须实现的方法,当Service绑定和改变时会回调该方法。 @覆盖 公共IBinder onBind(Intent 意图) { Log.i(TAG, 'onBind方法被调用!'); 返回活页夹; } //Service创建时回调 @覆盖 公共无效onCreate() { super.onCreate(); Log.i(TAG, 'onCreate方法被调用!'); //创建线程动态修改count的值 新线程() { 公共无效运行() { 同时(!退出) { 尝试 { 线程睡眠(1000); }catch(InterruptedException e){e.printStackTrace();} 计数++; } }; }。开始(); } //Service断开连接时的回调 @覆盖 公共布尔onUnbind(意图意图){ Log.i(TAG, 'onUnbind 方法被调用!'); 返回真; } //Service关闭前的回调 @覆盖 公共无效onDestroy(){ super.onDestroy(); this.quit=true; Log.i(TAG, 'onDestroyed 方法被调用!'); } @覆盖 公共无效onRebind(意图意图){ Log.i(TAG, 'onRebind方法被调用!'); super.onRebind(意图); } } 在AndroidManifest.xml中注册Service组件: 服务android:name='.TestService2' android:exported='false' 意图过滤器 动作android:name='com.jay.example.service.TEST_SERVICE2'/ /意图过滤器 /服务 MainActivity.java: 公共类MainActivity 扩展Activity { 私有按钮btnbind; 私有按钮btncancel; 私有按钮btnstatus; //保留启动的Service的IBinder对象,并定义一个ServiceConnection对象 TestService2.MyBinder 绑定器; 私有ServiceConnection conn=new ServiceConnection() { //当Activity与Service断开连接时回调该方法 @覆盖 公共无效onServiceDisconnected(ComponentName名称){ System.out.println('------服务已断开-----'); } //当Activity和Service连接成功时回调该方法。 @覆盖 public void onServiceConnected(ComponentName 名称, IBinder 服务) { System.out.println('------服务已连接-----'); 绑定器=(TestService2.MyBinder) 服务; } }; @覆盖 protected void onCreate(Bundle savingInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnbind=(按钮) findViewById(R.id.btnbind); btncancel=(按钮) findViewById(R.id.btncancel); btnstatus=(按钮) findViewById(R.id.btnstatus); 最终意图意图=新意图(); intent.setAction('com.jay.example.service.TEST_SERVICE2'); btnbind.setOnClickListener(new OnClickListener() { @覆盖 公共无效onClick(查看v){ //绑定服务 bindService(意图,conn,Service.BIND_AUTO_CREATE); } }); btncancel.setOnClickListener(new OnClickListener() { @覆盖 公共无效onClick(查看v){ //解绑服务 解除绑定服务(conn); } }); btnstatus.setOnClickListener(new OnClickListener() { @覆盖 公共无效onClick(查看v){ Toast.makeText(getApplicationContext(), 'Service的计数值为:' + binder.getCount(), Toast.LENGTH_SHORT).show(); } }); } } 运行截图: 点击锁定Service: 继续点击锁定:不做任何改变 获取当前服务:的状态 解绑: 如果我们再次绑定后直接关闭Activity,就会报错,然后会自动调用onUnbind和onDestory方法! 从上面的运行结果验证了生命周期图中的: 用户评论 晨与橙与城 感觉这个“服务”概念还是比较有意思的挺新鲜。 有13位网友表示赞同! 几妆痕 看了一下,服务内容很丰富,还挺全面。 有13位网友表示赞同! 杰克 这初涉之作表现得还蛮不错的呢! 有7位网友表示赞同! 站上冰箱当高冷 希望后续的服务能更加完善和成熟吧 有16位网友表示赞同! 寒山远黛 对Service初涉很有期待啊! 有5位网友表示赞同! 命里缺他 我感觉这个服务还是挺适合我的需求的 有19位网友表示赞同! ?亡梦爱人 Service真让人眼前一亮,很值得尝试一下。 有12位网友表示赞同! 十言i 希望以后能加入更多元的服务内容! 有9位网友表示赞同! Edinburgh°南空 总体不错,还有进步的空间. 有9位网友表示赞同! 断秋风 这是一个全新领域的探索,很有意思。 有7位网友表示赞同! 呆萌 期待后续能看到更加丰富的 Service 应用 有6位网友表示赞同! 请在乎我1秒 功能方面还蛮实用的啊! 有17位网友表示赞同! 短发 服务质量还可以,希望能更优质一些! 有7位网友表示赞同! 一笑傾城゛ 了解了一下 “Service” 它的潜力很大! 有17位网友表示赞同! 泡泡龙 这个“Service初涉”还挺符合我的实际需求的。 有9位网友表示赞同! 烬陌袅 感觉未来“服务”会得到越来越多的发展和创新 有5位网友表示赞同! 来自火星的我 希望能有更多针对不同用户群的服务内容! 有14位网友表示赞同! 娇眉恨 在"Service" 的道路上,这仅仅是开始. 有6位网友表示赞同! 麝香味 很 glad 看到这个 “初涉”!期待更多精彩的呈现。 有15位网友表示赞同! 快速报名 学生姓名 意向学校 意向专业 联系方式 请输入正确的电话号码 或许你还想看: 服务初体验 12Android基础知识服务 服务这个词有多重含义,整理出第三个 点赞 免责声明 本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除! 大家都在看 上一篇 12Android基础知识服务 下一篇 返回列表 大家都在看 服务初体验 1. 线程相关概念 在开始学习Service之前,我们先来了解一下线程的一些概念! 1)相关概念: 程序:为了完成特定任务而用某种语言编写的一组指令(一组静态代码)。进程:运行的程序,系统调度 艺考资讯 2024-10-08 12Android基础知识服务 啥也不说,先看图 Service 定义 服务是一个基本组件,可以在后台长时间执行,无需用户交互。 Service运行在主线程上,不能执行耗时的操作。线程一般是指新创建的子线程,不能更新UI 艺考资讯 2024-10-08 服务这个词有多重含义,整理出第三个 12) 服务用于表示有用和有帮助——它可以指设备、车辆、机器等,也可以指人。例如,为他人服务就是对他人有帮助。该船将在两年内退役。该船将在两年内退役,即不再使用。 13) 服 艺考资讯 2024-10-08 维修故障灯是什么? (此处已添加小程序,请前往今日头条客户端查看) 2、可能性很多,需要进一步检查。仅仅因为维修灯亮起并不意味着您的车辆存在严重故障。这只是一个警告信号,告诉您需要进一步检查 艺考资讯 2024-10-08 K8s日常笔记(36)服务概述 Service介绍 在k8s中,pod是应用程序的载体。我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址是不固定的,这意味着直接使用Pod的IP进行外部访问是不方便的。 为了解决这个问 艺考资讯 2024-10-08 英语早读必听:七年级英语第一册第八单元单词及录音 第八单元 当[wen] adv.什么时候 月[mn] n。月;月 一月['dnjuri] n.一月 二月['februri] n.二月 三月[m:t] n.行进 四月['eiprl] n.四月 May [mei] n.五月 六月[du:n] n.六月 艺考资讯 2024-10-08 单词关联包含有关 英国/pten/美国/prten/ v. 适合,大约,适用;法律隶属关系、归属;正式(在特定时间或地点)有效、现有 网络相关/ 同义词 六. 属于;关于;适合于 齿轮服务 词源 属于;相关于 词根词缀:perc 艺考资讯 2024-10-07 三年级英语第一卷第五单元它是什么颜色? 01单词: 1. 红色/红色/形容词(红色);名词(红色) 2. 颜色/'kl/名词(颜色);动词(颜色.) 3. 蓝色/blu:/形容词(蓝色);名词(蓝色) 4. 猜/ges/动词(猜测);猜测(第三人称单数) 5. green /gri:n/形容词( 艺考资讯 2024-10-07 外语研究院新标准英语9 M7U23关键句集 1.英语被用作工作语言,例如,老板和秘书之间、医生和病人之间,尽管还有其他日常使用的语言。英语被用作工作语言,例如,在老板和秘书之间、医生和病人之间,尽管还有其他日常使用的语 艺考资讯 2024-10-07 又长又难的英语句子没什么好或正常的 先找生词。 结果;正常正常; 符合(与.)一致;符合; 要求要求; 再找主干。 这句话是主从复合句。句子不是很长,但是看起来很奇怪。主句没有什么看起来是好的或正常的;不符合自由市场要求 艺考资讯 2024-10-07