首页 > 系统 > Android > 正文

Android中Service(后台服务)详解

2019-10-24 21:12:43
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Android中Service(后台服务)详解,本文讲解了Service的概念、作用、生命周期、启动方式和代码实例等内容,需要的朋友可以参考下

1.概念:

(1).Service可以说是一个在后台运行的Activity。它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了。

(2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示。

(3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用。

2.作用:

(1).它用于处理一些不干扰用户使用的后台操作。如下载,网络获取。播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用。

(2).如果说Activity是显示前台页面的信息,那么Service就是在后台进行操作的。如果Service和前台UI进行交互的话可以通过发送广播或者通知栏的方式。

3.生命周期:

(1).service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。和activity一样,service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。

(2).**startService()的方式:**onCreate()->onStartCommand()->onStart()->onDestroy()

(3).**BindService()的方式:**onCreate()->onBinder()->onUnbind()->onDestroy()。onUnbind()方法返回后就结束了。

4.启动方式:

(1).Service自己不能运行,需要通过某一个Activity或者其它Context对象来调用。

(2).Service的启动方式有两种:

Context.startService()和Context.bindService()两种方式启动Service。如果在service的onCreate()方法或者onStart()方法中有耗时的操作,要新开启一个线程。 在需要service的地方通过以上两种方式来启动。

注意:

平常使用多的是startService方法,可以把一些耗时的任务放到后台去处理,当处理完成后,可以通过广播或者通知栏来通知前台。

5.以下通过代码来深入理解:

(1).MainActivity.java类:

 

 
  1. package com.example.servicetest; 
  2.  
  3. import com.example.servicetest.service.MyService; 
  4.  
  5. import android.app.Activity; 
  6. import android.content.ComponentName; 
  7. import android.content.Intent; 
  8. import android.content.ServiceConnection; 
  9. import android.os.Bundle; 
  10. import android.os.IBinder; 
  11. import android.util.Log; 
  12. import android.view.View; 
  13. import android.view.View.OnClickListener; 
  14. import android.widget.Button; 
  15.  
  16. public class MainActivity extends Activity implements OnClickListener { 
  17. /** 标志位 */ 
  18. private static String TAG = "com.example.servicetest.MainActivity"
  19. /** 启动服务 */ 
  20. private Button mBtnStart; 
  21. /** 绑定服务 */ 
  22. private Button mBtnBind; 
  23.  
  24. @Override 
  25. protected void onCreate(Bundle savedInstanceState) { 
  26. super.onCreate(savedInstanceState); 
  27. setContentView(R.layout.activity_main); 
  28. initView(); 
  29.  
  30. /** 
  31. * init the View 
  32. */ 
  33. private void initView() { 
  34. mBtnStart = (Button) findViewById(R.id.startservice); 
  35. mBtnBind = (Button) findViewById(R.id.bindservice); 
  36. mBtnStart.setOnClickListener(this); 
  37. mBtnBind.setOnClickListener(this); 
  38.  
  39.  
  40. @Override 
  41. public void onClick(View view) { 
  42. switch (view.getId()) { 
  43. // 启动服务的方式 
  44. case R.id.startservice: 
  45. startService(new Intent(MyService.ACTION)); 
  46. break
  47. // 绑定服务的方式 
  48. case R.id.bindservice: 
  49. bindService(new Intent(MyService.ACTION), conn, BIND_AUTO_CREATE); 
  50.  
  51. break
  52.  
  53. default
  54.  
  55. break
  56.  
  57.  
  58. ServiceConnection conn = new ServiceConnection() { 
  59. public void onServiceConnected(ComponentName name, IBinder service) { 
  60. Log.v(TAG, "onServiceConnected"); 
  61.  
  62. public void onServiceDisconnected(ComponentName name) { 
  63. Log.v(TAG, "onServiceDisconnected"); 
  64. }; 
  65.  
  66. @Override 
  67. protected void onDestroy() { 
  68. super.onDestroy(); 
  69. System.out.println("-------onDestroy()--"); 
  70. stopService(new Intent(MyService.ACTION)); 
  71. unbindService(conn); 

(2).MyService.java类:

 

 
  1. package com.example.servicetest.service; 
  2.  
  3. import android.app.Service; 
  4. import android.content.Intent; 
  5. import android.os.Binder; 
  6. import android.os.IBinder; 
  7. import android.util.Log; 
  8.  
  9. public class MyService extends Service { 
  10. /** 标志位 */ 
  11. private static String TAG = "com.example.servicetest.service.MyService"
  12. /** 行为 */ 
  13. public static final String ACTION = "com.example.servicetest.service.MyService"
  14.  
  15. @Override 
  16. public void onCreate() { 
  17. super.onCreate(); 
  18.  
  19. System.out.println("----- onCreate() ---"); 
  20.  
  21.  
  22. @Override 
  23. public void onStart(Intent intent, int startId) { 
  24. super.onStart(intent, startId); 
  25. System.out.println("----- onStart() ---"); 
  26.  
  27. @Override 
  28. public int onStartCommand(Intent intent, int flags, int startId) { 
  29. System.out.println("----- onStartCommand() ---"); 
  30. return super.onStartCommand(intent, flags, startId); 
  31.  
  32. @Override 
  33. public IBinder onBind(Intent arg0) { 
  34. System.out.println("----- onBind() ---"); 
  35. return null
  36.  
  37.  
  38. @Override 
  39. public void onRebind(Intent intent) { 
  40. System.out.println("----- onRebind() ---"); 
  41. super.onRebind(intent); 
  42.  
  43. @Override 
  44. public boolean onUnbind(Intent intent) { 
  45. System.out.println("----- onUnbind() ---"); 
  46. return super.onUnbind(intent); 
  47.  
  48. @Override 
  49. public void onDestroy() { 
  50. System.out.println("----- onDestroy() ---"); 
  51. super.onDestroy(); 
  52.  

(3).AndroidManifest.xml

 

 
  1. <!-- 注册 --> 
  2. <service android:name="com.example.servicetest.service.MyService" > 
  3. <intent-filter> 
  4.  
  5. <!-- 用来启动服务的Intent --> 
  6. <action android:name="com.example.servicetest.service.MyService" /> 
  7.  
  8. <category android:name="android.intent.category.default" /> 
  9. </intent-filter> 
  10. </service> 

Android中Service(后台服务)详解

StartService方法:

(1).当按startService按钮的时候:如下:

Android中Service(后台服务)详解

(2).再继续按startService按钮的时候:如下:

Android中Service(后台服务)详解

BindService方法:

(1).当按bindService按钮的时候:如下:

Android中Service(后台服务)详解

(2).再继续按bindService按钮的时候:如下:

Android中Service(后台服务)详解

(3).先按startService按钮再按bindService按钮:如下:

Android中Service(后台服务)详解

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表