Service的生命周期 (适用于2.1及以上)

1. 被startService的
无论是否有任何活动绑定到该Service,都在后台运行。onCreate(若需要) -> onStart(int id, Bundle args).多次startService,则onStart调用多次,但不会创建多个Service实例,只需要一次stop。该Service一直后台运行,直到stopService或者自己的stopSelf()或者资源不足由平台结束。

2. 被bindService的
调用bindService绑定,连接建立服务一直运行。未被startService只是BindService,则onCreate()执行,onStart(int,Bundle)不被调用;这种情况下绑定被解除,平台就可以清除该Service(连接销毁后,会导致解除,解除后就会销毁)。

3. 被启动又被绑定
类似startService的生命周期,onCreate onStart都会调用。

4. 停止服务时
stopService时显式onDestroy()。或不再有绑定(没有启动时)时隐式调用。有bind情况下stopService()不起作用。

以下是一个简单的实现例子,某些部分需要配合logcat观察。
AcMain.java

  1. package jtapp.myservicesamples;
  2. import android.app.Activity;
  3. import android.content.ComponentName;
  4. import android.content.Context;
  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. import android.widget.Toast;
  14. public class AcMain extends Activity implements OnClickListener {
  15. private static final String TAG = "AcMain";
  16. private Button btnStart;
  17. private Button btnStop;
  18. private Button btnBind;
  19. private Button btnExit;
  20. /** Called when the activity is first created. */
  21. @Override
  22. public void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.main);
  25. findView();
  26. }
  27. private void findView() {
  28. btnStart = (Button) findViewById(R.id.Start);
  29. btnStop = (Button) findViewById(R.id.Stop);
  30. btnBind = (Button) findViewById(R.id.Bind);
  31. btnExit = (Button) findViewById(R.id.Exit);
  32. btnStart.setOnClickListener(this);
  33. btnStop.setOnClickListener(this);
  34. btnBind.setOnClickListener(this);
  35. btnExit.setOnClickListener(this);
  36. }
  37. @Override
  38. public void onClick(View v) {
  39. Intent intent = new Intent("jtapp.myservicesamples.myservice");
  40. switch(v.getId()) {
  41. case R.id.Start:
  42. startService(intent);
  43. Toast.makeText(this,
  44. "myservice running " + MyService.msec/1000.0 + "s.",
  45. Toast.LENGTH_LONG).show();
  46. break;
  47. case R.id.Stop:
  48. stopService(intent);
  49. Toast.makeText(this,
  50. "myservice running " + MyService.msec/1000.0 + "s.",
  51. Toast.LENGTH_LONG).show();
  52. break;
  53. case R.id.Bind:
  54. bindService(intent, sc, Context.BIND_AUTO_CREATE);
  55. break;
  56. case R.id.Exit:
  57. this.finish();
  58. break;
  59. }
  60. }
  61. private MyService serviceBinder;
  62. private ServiceConnection sc = new ServiceConnection() {
  63. @Override
  64. public void onServiceDisconnected(ComponentName name) {
  65. Log.d(TAG, "in onServiceDisconnected");
  66. serviceBinder = null;
  67. }
  68. @Override
  69. public void onServiceConnected(ComponentName name, IBinder service) {
  70. Log.d(TAG, "in onServiceConnected");
  71. serviceBinder = ((MyService.MyBinder)service).getService();
  72. }
  73. };
  74. @Override
  75. protected void onDestroy() {
  76. //this.unbindService(sc);
  77. //this.stopService(
  78. // new Intent("jtapp.myservicesamples.myservice"));
  79. super.onDestroy();
  80. }
  81. }
复制代码


main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextView android:layout_width="fill_parent"
  6. android:layout_height="wrap_content" android:text="@string/hello" />
  7. <Button android:text="Start MyService" android:id="@+id/Start"
  8. android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  9. <Button android:text="Stop MyService" android:id="@+id/Stop"
  10. android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  11. <Button android:text="Bind MyService" android:id="@+id/Bind"
  12. android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  13. <Button android:text="Exit AcMain" android:id="@+id/Exit"
  14. android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  15. </LinearLayout>
复制代码

MyService.java

  1. package jtapp.myservicesamples;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.Binder;
  5. import android.os.IBinder;
  6. import android.util.Log;
  7. public class MyService extends Service {
  8. private static final String TAG = "MyService";
  9. public static long msec = 0;
  10. private boolean bThreadRunning = true;
  11. private final IBinder binder = new MyBinder();
  12. public class MyBinder extends Binder {
  13. MyService getService() {
  14. return MyService.this;
  15. }
  16. }
  17. @Override
  18. public IBinder onBind(Intent intent) {
  19. return binder;
  20. }
  21. @Override
  22. public void onCreate() {
  23. new Thread(new Runnable(){
  24. @Override
  25. public void run() {
  26. while (bThreadRunning) {
  27. try {
  28. Thread.sleep(100);
  29. } catch (InterruptedException e) {
  30. }
  31. Log.i(TAG, "myservice running " + (msec+=100) + "ms.");
  32. }
  33. }
  34. }).start();
  35. }
  36. @Override
  37. public void onDestroy() {
  38. bThreadRunning = false;
  39. super.onDestroy(); // 可以不用
  40. }
  41. }
复制代码

AnndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="jtapp.myservicesamples" android:versionCode="1"
  4. android:versionName="1.0">
  5. <application android:icon="@drawable/icon" android:label="@string/app_name"
  6. android:debuggable="true">
  7. <activity android:name=".AcMain" android:label="@string/app_name">
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN" />
  10. <category android:name="android.intent.category.LAUNCHER" />
  11. </intent-filter>
  12. </activity>
  13. <service android:name="MyService">
  14. <intent-filter>
  15. <action android:name="jtapp.myservicesamples.myservice"></action>
  16. </intent-filter>
  17. </service>
  18. </application>
  19. </manifest>
复制代码


更多相关文章

  1. Android(安卓)Camera 运行流程
  2. Js Android(安卓)交互
  3. Android(安卓)5.0(Lollipop)事件输入系统(Input System)
  4. Android(安卓)图片的裁剪与相机调用
  5. 读书笔记——《Android(安卓)开发艺术探索》Activity工作过程阅
  6. Android(安卓)DataBinding的使用
  7. Android进阶(三)ButterKnife源码解析
  8. Android(安卓)电话涉及到的几个类备注
  9. Android手机客户端访问.NET服务器端的方法(1)

随机推荐

  1. Android开发5――文件读写
  2. 我在SD2.0大会上的视频教程
  3. Android解析中国天气接口JSon数据,应用于
  4. [置顶] Android系统移植与调试之------->
  5. 总结的一些android公共库
  6. Android初级教程理论知识(第一章快速入门)
  7. Android ndk 开发环境搭建 和 示例
  8. android ftp 客户端编写(ftp4j)
  9. android制作开关机动画注意事项
  10. Android使用Intent一键分享图片文字到腾