当前位置:   article > 正文

Android Service应用详解_安卓的service应用

安卓的service应用

1、Service概括

由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.Android系统提供了Service服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用Service,典型的例子就是:MP3播放器。

Service非常适用于无需用户干预,且需要长期运行的后台功能。Service没有用户界面,有利于降低系统资源。而且Service比Activity具有更高的优先级,只有在系统资源极度匮乏的情况下,android系统才可能清理掉一部分service来保证系统的运行,而这种情况却又轻易不会出现。即使Service被系统终止了,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件。Service除了实现后台服务功能,还可以用于进程间通信,解决两个不同Activity应用程序进程之间的调用和通信问题。

2、Service生命周期

Service的生命周期如下图所示:
在这里插入图片描述

bindService和startService都是启动Service,有什么地方不一样呢:

  1. startService Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系, 即使调用者退出了,服务依然在进行
    【onCreate()->onStartCommand()->startService()->onDestroy()】,
    注意其中没有onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。

  2. bindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起, 调用者一旦退出服务也就终止了
    【onCreate()->onBind()->onUnbind()->onDestroy()】。

3、bindService和startService使用说明

在 Android 中,startService 和 bindService 是用于与服务(Service)进行交互的两种不同方式。它们各有用途和特点,适用于不同的使用场景。以下是对这两种方法的详细说明:

3.1、 startService

用途
startService 用于启动一个服务,以执行长时间运行的操作。即使启动服务的组件(例如 Activity)被销毁,服务也会继续运行,直到调用 stopSelf() 或 stopService() 方法停止服务。

典型用法
使用 startService 通常用于执行无需与调用组件交互的后台任务,例如下载文件、播放音乐等。

示例代码
启动服务:

Intent intent = new Intent(this, MyService.class);
startService(intent);
  • 1
  • 2

在服务中处理启动请求:

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 在这里执行后台任务
        // 如果服务被杀死,使用START_STICKY或其他返回值让服务重启
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null; // 此处返回null,因为不支持绑定
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

停止服务:

Intent intent = new Intent(this, MyService.class);
stopService(intent);
  • 1
  • 2

3.2、 bindService

用途
bindService 用于绑定到一个服务,允许组件(例如 Activity)与服务进行交互。绑定的服务在所有绑定的客户端解除绑定之前不会被销毁。当最后一个绑定解除时,服务会被销毁,除非它是由 startService 启动的。

典型用法
使用 bindService 通常用于客户端和服务之间需要频繁通信的场景,例如客户端需要调用服务中的方法,或服务需要回调客户端的方法。

示例代码
定义服务接口:

public class MyService extends Service {
    private final IBinder binder = new LocalBinder();

    public class LocalBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    // 服务中可被客户端调用的方法
    public int getRandomNumber() {
        return new Random().nextInt(100);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

绑定服务:

public class MainActivity extends AppCompatActivity {
private MyService myService;
private boolean isBound = false;

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LocalBinder binder = (MyService.LocalBinder) service;
        myService = binder.getService();
        isBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        isBound = false;
    }
};

@Override
protected void onStart() {
    super.onStart();
    Intent intent = new Intent(this, MyService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    if (isBound) {
        unbindService(connection);
        isBound = false;
    }
}

public void useService() {
    if (isBound) {
        int number = myService.getRandomNumber();
        // 使用服务提供的数据
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

}

4、使用总结

4.1、生命周期:

startService:服务由 startService 启动后会一直运行,直到调用 stopSelf() 或 stopService()。它不依赖于启动它的组件的生命周期。 bindService:服务由 bindService 启动后会在所有绑定的组件解除绑定时停止。它的生命周期依赖于绑定的组件。

4.2、交互方式:

startService:不提供直接与组件交互的接口,主要用于执行后台任务。
bindService:提供与组件交互的接口,组件可以调用服务中的方法进行通信。

4.3、使用场景:

startService:适用于需要在后台长时间运行的任务,例如下载文件、播放音乐等。
bindService:适用于需要与服务频繁交互的任务,例如获取实时数据、控制服务行为等。

通过理解这两种方法的区别和用途,可以根据具体需求选择合适的方式与服务进行交互。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

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

闽ICP备14008679号