Android Service应用详解

2024-06-04 4765阅读

1、Service概括

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

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

2、Service生命周期

Service的生命周期如下图所示:

Android Service应用详解 第1张

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);

在服务中处理启动请求:

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,因为不支持绑定
    }
}

停止服务:

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

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);
    }
}

绑定服务:

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();
        // 使用服务提供的数据
    }
}

}

4、使用总结

4.1、生命周期:

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

4.2、交互方式:

startService:不提供直接与组件交互的接口,主要用于执行后台任务。

bindService:提供与组件交互的接口,组件可以调用服务中的方法进行通信。

4.3、使用场景:

startService:适用于需要在后台长时间运行的任务,例如下载文件、播放音乐等。

bindService:适用于需要与服务频繁交互的任务,例如获取实时数据、控制服务行为等。

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

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

Android Service应用详解 第2张


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]