深入探索Android技术:掌握Service核心技巧

更新:11-12 现代故事 我要投稿 纠错 投诉

例子:

定义服务类

公共类MyService 扩展服务{

//onBind是一个抽象方法,必须实现

@覆盖

公共IBinder onBind(Intent 意图) {

返回新的MyBinder();

}

@覆盖

公共无效onCreate() {

super.onCreate();

}

@覆盖

公共无效onDestroy(){

super.onDestroy();

}

@覆盖

公共无效onRebind(意图意图){

super.onRebind(意图);

}

@覆盖

公共无效onStart(Intent意图,int startId){

super.onStart(意图, startId);

}

@覆盖

公共布尔onUnbind(意图意图){

返回super.onUnbind(intent);

}

/**

* 构造一个MyBinder类,该类继承自Binder,Binder实现了IBinder的接口

*/

公共类MyBinder 扩展Binder{

//返回Service实例的引用

公共MyService getId(){

返回MyService.this;

}

}

}

启动方法为startService:

//启动一个服务

Intent意图=newIntent(this,MyService.class);

启动服务(意图);

//停止服务

停止服务(意图);

startService()启动方法的生命周期为:

context.startService() -onCreate() -onStart() -服务正在运行-context.stop() -onDestroy() -服务关闭

启动模式为bindService:

私有类MyServiceConnection 实现ServiceConnection{

公共MyServiceConnection(){}

@覆盖

公共无效onServiceConnected(ComponentName arg0,IBinder活页夹){

MyService Myservice=((MyService.MyBinder)binder).getService();

//绑定成功后调用

}

@覆盖

公共无效onServiceDisconnected(ComponentName arg0){

//服务崩溃时调用

}

}

然后绑定启动Service

//绑定服务

Intent意图=newIntent(this,MyService.class);

MyServiceConnection conn=newMyServiceConnection();

bindService(意图,conn,Context.BIND_AUTO_CREATE);

//解绑服务

解除绑定服务(conn);

当我们执行bindService()时,系统会调用onCreate()和onBind()。 onBind()执行后,会回调ServiceConnection中的onServiceConnected()方法,并返回一个实现IBinder接口的IBinder接口。类(一般我们选择传回继承自Binder的子类,因为Binder实现了IBinder的接口),然后我们可以通过某种手段从IBinder获取Service实例(参考上面的代码)。

bindService()启动方式生命周期:

context.bindService() -onCreate() -onBind() -服务正在运行-context.unBindService() -onUnbind() -onDestroy() -服务已关闭

某些特殊情况:

场景一:当我们在组件中调用startService()来启动Service,但是没有调用stopService()来销毁Service,那么当我们再次调用startService()来启动Service时,又没有调用onCreate()回调方法只执行onStart()。为什么?因为在Android系统中,每个Service都被设置为单例模式,无论调用多少次startService()来启动Service,系统中始终只会运行一个Service。 OnCreate()在Service创建时被调用,因此如果Service多次启动,onCreate()将不会被调用。因为此时Service已经存在于系统中,所以只会调用onStart()。也就是说,多次启动服务时,onCreate()只会被调用一次,但onStart()可以被调用多次。

场景二:当我们需要清除startService()启动的Service时,调用stopService()就可以满足我们的小需求。这时,程序通常会按照我们的预期执行onDestroy()。但如果我们不使用stopService()这把剑,而是直接杀掉调用者(比如Activity),onDestroy()方法会被执行吗?答案是否定的,因为自从Service启动之后,服务就已经和调用者分离了。调用者无论生老病死都与他无关,除非通过intent键入stopService()来回收服务。当然,这一切都是建立在Service是通过startService启动的前提下。

场景3:现在我们来谈谈绑定服务(bindService)。和startService一样,如果Service被重复启动,onCreate()仍然只会在Service创建时第一次调用。至于onBind(),每次重复绑定服务时都会调用它。这里onBind()的主要作用就是将Ibinder传回binder,并用它来建立binder和Service之间的连接。而如果有多个绑定,那么执行unbindService()只会触发onUnbind(),而不会触发onDestroy()。只有最后一个binder调用unbindService()才会触发service的onDestroy()调用。还有一个特别的地方是,如果binder(比如Activity)被销毁了,绑定的Service也会跟着他一起走(执行onUnbid-onDestroy)。

写在最后

1.如果你需要一个调用者退出后不会被销毁的函数,但同时需要获取它的引用,那么就有这么一个小方法。首先startService()启动服务,然后bindService绑定服务。这时就可以获取Service的引用,然后unbindService。由于startService是先启动的,所以只会执行onUnbind()。此时,由于没有绑定关系,即使服务被调用者挂掉了,但是Service仍然像以前一样运行。

2、Service虽然说是后台运行,但实际上说是还是在主线程运行。这里运行在主线程上是指它的onCreate、onStart、onBind等生命周期方法运行在主线程上。如果这些方法用于下载等,读取大文件等耗时工作会导致主线程阻塞;所以我们通常会在Service中启动一个新的子线程来运行我们需要的业务。

3、Service的启动、绑定、停止、解除绑定应该在相应调用者相应的生命周期内。例如,如果Service需要跑遍整个Activity,我们可以在onCreate中启动并绑定Service,在onDestroy中停止或解除绑定。服务。如果您只需要在用户位于前台时运行服务,则应在onStart 和onStop 中进行相应处理。不建议在onPause和onResume中启动和停止服务,因为这可能会造成不必要的性能消耗。例如,当两个Activity同时需要这个服务时,那么前一个Activity的onPause刚刚结束了该服务。下一个activity在onResume中立即启动服务,导致一些恶心的问题。

4、有人想为什么bindService启动时不返回IBinder给调用者。这是因为该服务是异步启动的。调用bindService时无法获取并返回IBinder,只能稍后通过调用onbind来使用。将IBinder扔到onServiceConnected的参数中。

用户评论

相知相惜

我最近也想学Android开发,Service听起来挺实用的。

    有9位网友表示赞同!

凉话刺骨

想做后台任务处理,学习Service应该是必不可少的啊!

    有9位网友表示赞同!

淡写薰衣草的香

之前看到别人用Service实现的音乐播放功能,还挺有意思的。

    有12位网友表示赞同!

冷眼旁观i

感觉Service和activity不一样,需要好好理解下他们的区别。

    有7位网友表示赞同!

忘故

学习Android开发就要从基础知识入手,这样才能学得更深入!

    有8位网友表示赞同!

若他只爱我。

听说Service的生命周期比较复杂,要花时间好好研究一下。

    有5位网友表示赞同!

琴断朱弦

想了解一下不同类型的Service,比如后台执行任务和运行服务?

    有10位网友表示赞同!

短发

有没有什么好的教程可以推荐?我想要学习Android的Service概念。

    有20位网友表示赞同!

仅有的余温

看下别人怎么用Service实现下载文件的进度条效果!

    有18位网友表示赞同!

风中摇曳着长发

我觉得掌握服务的使用能让我开发app的功能更丰富。

    有8位网友表示赞同!

封心锁爱

学Service还要注意它的生命周期管理,这很重要啊!

    有5位网友表示赞同!

终究会走-

希望能够学会利用Service来提高App的后台处理能力。

    有7位网友表示赞同!

龙卷风卷走爱情

Android的服务功能很强大,可以用来完成很多有意思的事情!

    有9位网友表示赞同!

站上冰箱当高冷

看能不能用Service实现自动更新的功能呢?

    有18位网友表示赞同!

温柔腔

学习Service是一个循序渐进的过程,需要慢慢积累经验。

    有7位网友表示赞同!

不离我

期待能利用Service开发出更智能、更实用的应用。

    有16位网友表示赞同!

江山策

Service是Android开发中比较重要的一个模块,值得深入学习。

    有20位网友表示赞同!

瑾澜

希望学完Service之后,能够自己写一些具有后台功能的应用程序。

    有16位网友表示赞同!

■孤独像过不去的桥≈

感觉学习Service会提升我的Android开发水平!

    有13位网友表示赞同!

【深入探索Android技术:掌握Service核心技巧】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:深入解析1688详情API接口:全面获取与应用攻略 下一篇:《金瓶梅》第四十二回:西门庆翡翠轩寻欢,潘金莲卷棚窥听秘闻