艺考网
全国站

服务初体验

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位网友表示赞同!

免责声明
本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除!

大家都在看

服务初体验

服务初体验

1. 线程相关概念 在开始学习Service之前,我们先来了解一下线程的一些概念! 1)相关概念: 程序:为了完成特定任务而用某种语言编写的一组指令(一组静态代码)。进程:运行的程序,系统调度
2024-10-08
12Android基础知识服务

12Android基础知识服务

啥也不说,先看图 Service 定义 服务是一个基本组件,可以在后台长时间执行,无需用户交互。 Service运行在主线程上,不能执行耗时的操作。线程一般是指新创建的子线程,不能更新UI
2024-10-08
服务这个词有多重含义,整理出第三个

服务这个词有多重含义,整理出第三个

12) 服务用于表示有用和有帮助——它可以指设备、车辆、机器等,也可以指人。例如,为他人服务就是对他人有帮助。该船将在两年内退役。该船将在两年内退役,即不再使用。 13) 服
2024-10-08
维修故障灯是什么?

维修故障灯是什么?

(此处已添加小程序,请前往今日头条客户端查看) 2、可能性很多,需要进一步检查。仅仅因为维修灯亮起并不意味着您的车辆存在严重故障。这只是一个警告信号,告诉您需要进一步检查
2024-10-08
K8s日常笔记(36)服务概述

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关键句集

外语研究院新标准英语9 M7U23关键句集

1.英语被用作工作语言,例如,老板和秘书之间、医生和病人之间,尽管还有其他日常使用的语言。英语被用作工作语言,例如,在老板和秘书之间、医生和病人之间,尽管还有其他日常使用的语
2024-10-07
又长又难的英语句子没什么好或正常的

又长又难的英语句子没什么好或正常的

先找生词。 结果;正常正常; 符合(与.)一致;符合; 要求要求; 再找主干。 这句话是主从复合句。句子不是很长,但是看起来很奇怪。主句没有什么看起来是好的或正常的;不符合自由市场要求
2024-10-07