android之Service介绍之一

本文详细介绍了Android中的服务(service)概念及其应用场景,包括服务的特点、分类、生命周期及如何在应用程序中启动、绑定、解绑和停止服务。同时,还提供了一个具体的音乐播放服务实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,让我们确认下什么是service?

service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互、它必须由用户或者其他程序显式的启动、它的优先级比较高,它比处于前台的应用优先级低,但是比后台的其他应用优先级高,这就决定了当系统因为缺少内存而销毁某些没被利用的资源时,它被销毁的概率很小哦。

那么,什么时候,我们需要使用service呢?

我们知道,service是运行在后台的应用,对于用户来说失去了被关注的焦点。这就跟我们打开了音乐播放之后,便想去看看图片,这时候我们还不想音乐停止,这里就会用到service;又例如,我们打开了一个下载链接之后,我们肯定不想瞪着眼睛等他下载完再去做别的事情,对吧?这时候如果我们想手机一边在后台下载,一边可以让我去看看新闻啥的,就要用到service。

service分类:

一般我们认为service分为两类,本地service和远程service。

本地service顾名思义,那就是和当前应用在同一个进程中的service,彼此之间拥有共同的内存区域,所以对于某些数据的共享特别的方便和简单;

远程service:主要牵扯到不同进程间的service访问。因为android的系统安全的原因导致了我们在不同的进程间无法使用一般的方式共享数据。在这里android为我们提供了一个AIDL工具。(android interface description language)android接口描述语言。在后边我们将会对其进行详细的介绍。

service生命周期:

和Activity相比,service的生命周期已经简单的不能再简单了,只有onCreate()->onStart()->onDestroy()三个方法。

Activity中和service有关的方法:

startService(Intent intent):启动一个service

stopService(Intent intent) :停止一个service

如果我们想使用service中的一些数据或者访问其中的一些方法,那么我们就要通过下面的方法:

public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;

public void unbindService(ServiceConnection conn);

intent是跳转到service的intent,如 Intent intent = new Intent(); intent.setClass(this,MyService.class);

conn则是一个代表与service连接状态的类,当我们连接service成功或失败时,会主动触发其内部的onServiceConnected或onServiceDisconnected方法。如果我们想要访问service中的数据,可以在onServiceConnected()方法中进行实现,例如

[java:nogutter] view plain copy print ?
  1. /**
  2. * 链接到service时触发。
  3. * name 链接到service组件的名称
  4. * service 在service中调用onBund时返回的IBinder,主要用来进行信息的交流
  5. */
  6. @Override
  7. public void onServiceConnected(ComponentName name, IBinder service) {
  8. Log.i("通知", "链接成功!");
  9. MyBinder binder = (MyBinder)service;
  10. MyService myService = binder.getMyService();
  11. int count = myService.getCount();
  12. Log.i("通知", "count="+count);
  13. }

-------------------------------------------------------------------

使用service的步骤:

第一步:我们要继承service类,实现自己的service。

如果想要访问service中的某些值,我们通常会提供一个继承了Binder的内部类,通过onBund()方法返回给service请求。这里实际上巧妙的利用了内部类能够访问外部类属性的特点。

第二步:在androidManifest.xml中进行注册,如:

<!--
service配置开始
-->
<service android:name="MyService"></service>
<!--
service配置结束
-->

第三步:在activity中进行启动、绑定、解绑或者停止service。

(很多书上说,service与用户是不能交互的,其实这话很不正确,我们完全可以通过activity与service进行交互嘛!我觉得,确切的说法应该是service与用户不能进行直接的交互)。

------------------------------------------------------

下边提供一个调用service听音乐的例子:

activity代码:

[java:nogutter] view plain copy print ?
  1. package cn.com.chenzheng_java;
  2. import cn.com.chenzheng_java.MyService.MyBinder;
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.IBinder;
  9. import android.util.Log;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.Button;
  13. /**
  14. * @description 对service进行简单的应用
  15. * @author chenzheng_java
  16. * @since 2011/03/18
  17. *
  18. */
  19. public class ServiceActivity extends Activity implements OnClickListener{
  20. private Button button_start ;
  21. private Button button_bind ;
  22. private Button button_destroy ;
  23. private Button button_unbind;
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.service);
  28. button_start = (Button) findViewById(R.id.button1_service);
  29. button_bind = (Button) findViewById(R.id.button2_service);
  30. button_destroy = (Button) findViewById(R.id.button3_service);
  31. button_unbind = (Button) findViewById(R.id.button4_service);
  32. button_start.setOnClickListener(this);
  33. button_bind.setOnClickListener(this);
  34. button_destroy.setOnClickListener(this);
  35. button_unbind.setOnClickListener(this);
  36. }
  37. private class MyServiceConnection implements ServiceConnection{
  38. /**
  39. * 链接到service时触发。
  40. * name 链接到service组件的名称
  41. * service 在service中调用onBund时返回的IBinder,主要用来进行信息的交流
  42. */
  43. @Override
  44. public void onServiceConnected(ComponentName name, IBinder service) {
  45. Log.i("通知", "链接成功!");
  46. MyBinder binder = (MyBinder)service;
  47. MyService myService = binder.getMyService();
  48. int count = myService.getCount();
  49. Log.i("通知", "count="+count);
  50. }
  51. @Override
  52. public void onServiceDisconnected(ComponentName name) {
  53. Log.i("通知", "链接未成功!");
  54. }
  55. }
  56. private MyServiceConnection serviceConnection = new MyServiceConnection();
  57. @Override
  58. public void onClick(View v) {
  59. if(v == button_start){
  60. Intent intent = new Intent();
  61. intent.setClass(getApplicationContext(), MyService.class);
  62. startService(intent);
  63. }
  64. if(v == button_bind){
  65. Intent intent = new Intent();
  66. intent.setClass(getApplicationContext(), MyService.class);
  67. bindService(intent,serviceConnection , BIND_AUTO_CREATE);
  68. }
  69. if(v==button_destroy){
  70. Intent intent = new Intent();
  71. intent.setClass(getApplicationContext(), MyService.class);
  72. stopService(intent);
  73. }
  74. if(v==button_unbind){
  75. unbindService(serviceConnection);
  76. }
  77. }
  78. }

继承service的类:

[java:nogutter] view plain copy print ?
  1. package cn.com.chenzheng_java;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.media.MediaPlayer;
  5. import android.os.Binder;
  6. import android.os.IBinder;
  7. import android.util.Log;
  8. /**
  9. * @description 实现自己的service
  10. * @author chenzheng_java
  11. * @since 2011/03/18
  12. */
  13. public class MyService extends Service {
  14. MediaPlayer mediaPlayer;
  15. /**
  16. * 当用户调用bindService方法时会触发该方法 返回一个IBinder对象,我们可以通过该对象,对service中 的某些数据进行访问
  17. */
  18. @Override
  19. public IBinder onBind(Intent intent) {
  20. Log.i("通知", "service绑定成功!");
  21. return new MyBinder();
  22. }
  23. @Override
  24. public void onCreate() {
  25. Log.i("通知", "service创建成功!");
  26. mediaPlayer = MediaPlayer.create(this, R.raw.aiweier);
  27. mediaPlayer.setLooping(false);
  28. super.onCreate();
  29. }
  30. @Override
  31. public void onDestroy() {
  32. mediaPlayer.stop();
  33. Log.i("通知", "service销毁成功!");
  34. super.onDestroy();
  35. }
  36. @Override
  37. public void onRebind(Intent intent) {
  38. Log.i("通知", "service重新绑定成功!");
  39. super.onRebind(intent);
  40. }
  41. @Override
  42. public void onStart(Intent intent, int startId) {
  43. mediaPlayer.start();
  44. Log.i("通知", "service start成功!");
  45. super.onStart(intent, startId);
  46. }
  47. @Override
  48. public boolean onUnbind(Intent intent) {
  49. mediaPlayer.stop();
  50. Log.i("通知", "service解绑成功!");
  51. return super.onUnbind(intent);
  52. }
  53. private int count = 100;
  54. public int getCount() {
  55. return count;
  56. }
  57. public void setCount(int count) {
  58. this.count = count;
  59. }
  60. public class MyBinder extends Binder {
  61. /**
  62. * @return 返回一个个人的service对象
  63. */
  64. MyService getMyService() {
  65. return MyService.this;
  66. }
  67. }
  68. }

service.xml代码:

androidManifest.xml

最终效果图:

---------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值