当前位置:   article > 正文

Android之服务service_android 服务

android 服务

目录

1、基础知识

2、生命周期

3、基本用法

3.1 定义一个服务

3.2 启动和停止服务

3.3 活动和服务进行通信


1、基础知识

(1.1)定义

服务是实现后台运行的解决方案,适合执行那些不需要用户交互且需要长期运行的任务。即使程序被切换到后台,或者打开另一个程序,服务依然能够正常运行。但是服务是依赖创建服务时所在的应用进程,当应用进程被杀掉时,服务也会停止。另外服务中的代码默认运行在主线程中,如果需要执行耗时操作需要在服务内部创建子线程执行,否则可能出现ANR

(1.2)作用

提供后台长期运行任务,比如耗时计算,音乐播放,下载等

2、生命周期

服务提供了如下几个生命周期内可回调的方法onCreate()、onStartCommand()、onBind()和onDestory()。

当调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没创建过,onCreate方法会优先于onStartCommand方法执行。服务启动后会一直保持运行状态,直到stopService或stopSelf方法被调用。每次调用startService方法,onStartCommand就会执行一次,但onCreate只会执行一次。

还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务的onBind()方法。如果服务还没创建,则onCreate方法会先于onBind方法执行。

当调用了startSevice方法后,又去调用stopService方法,这时服务中的onDestory方法就会执行。类似的,当调用了bindService后,又去调用unbindService方法,onDestory方法也会执行。需要注意,当调用了startService后又调用了bindService方法,需要同时调用stopService和unbindService方法,onDestory才会执行。

3、基本用法

3.1 定义一个服务

新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。

通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。

  1. public class MyService extends Service {
  2. @Override
  3. public IBinder onBind(Intent intent) {
  4. throw new UnsupportedOperationException("Not yet implemented");
  5. }
  6. @Override
  7. public void onCreate() {
  8. System.out.println("onCreate=========");
  9. }
  10. @Override
  11. public int onStartCommand(Intent intent, int flags, int startId) {
  12. System.out.println("onStartCommand=========");
  13. return super.onStartCommand(intent, flags, startId);
  14. }
  15. @Override
  16. public void onDestroy() {
  17. super.onDestroy();
  18. System.out.println("onDestroy=========");
  19. }
  20. }
  1. <service
  2. android:name=".MyService"
  3. android:enabled="true"/>

3.2 启动和停止服务

调用Context的startService方法启动服务,调用Context.stopService方法停止服务,也可以在Service的任意位置调用调用stopSelf方法来停止服务

  1. private void start() {
  2. Intent intent = new Intent(this, DownService.class);
  3. startService(intent);
  4. }
  5. private void stop() {
  6. Intent intent = new Intent(this, DownService.class);
  7. stopService(intent);
  8. }

3.3 活动和服务进行通信

我们在活动里调用startService方法来启动Service后,onCreate和onStartCommand方法得到执行。之后服务一直处于运行状态,但具体运行什么逻辑,活动控制不了。可以借用onBind方法来使得活动和服务关联起来

  1. public class MyService extends Service {
  2. class MyBinder extends Binder {
  3. public void startDownload() {
  4. System.out.println("startDownload");
  5. }
  6. public void stopDownload() {
  7. System.out.println("stopDownload");
  8. }
  9. }
  10. private MyBinder binder = new MyBinder();
  11. @Override
  12. public IBinder onBind(Intent intent) {
  13. return binder;
  14. }
  15. }

可以看到,我们新建了一个MyBinder类,继承Binder,在类中定义了开始下载和停止下载的方法。接着在MyService类中创建了MyBinder实例,并在onBind()方法里返回了这个实例。下面看下在Activity中如何去调用服务中的这些方法

  1. private ServiceConnection myConnection = new ServiceConnection() {
  2. @Override
  3. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  4. MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
  5. myBinder.startDownload();
  6. myBinder.stopDownload();
  7. }
  8. @Override
  9. public void onServiceDisconnected(ComponentName componentName) {
  10. }
  11. };
  12. private void bind() {
  13. Intent intent = new Intent(this, DownService.class);
  14. bindService(intent, myConnection, BIND_AUTO_CREATE);
  15. }
  16. private void unbind() {
  17. unbindService(myConnection);
  18. }

首先创建了一个ServiceConnection匿名类,重写了onServiceConnected方法和onServiceDisConnected方法,这两个方法会在活动与服务成功绑定和接触绑定时调用。在onServiceConnected方法中,我们通过向下转型得到了MyBinder实例,就可以调用该实例中的方法了。

活动和服务绑定通过调用bindService方法,该方法接收三个参数,第一个是Intent对象,第二个是ServiceConnection实例,第三个是BIND_AUTO_CREATE表示活动和服务绑定后自动创建服务。

解除绑定通过调用unbindService方法,接收一个ServiceConnection实例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/311065
推荐阅读
相关标签
  

闽ICP备14008679号