Android中的Service使用

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


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.         
  12.         
  13.         private final IBinder binder = new MyBinder();
  14.         public class MyBinder extends Binder {
  15.                 MyService getService() {
  16.                         return MyService.this;
  17.                 }
  18.         }
  19.         @Override
  20.         public IBinder onBind(Intent intent) {
  21.                 return binder;
  22.         }
  23.         @Override
  24.         public void onCreate() {
  25.                 new Thread(new Runnable(){
  26.                         @Override
  27.                         public void run() {
  28.                                 while (bThreadRunning) {
  29.                                         try {
  30.                                                 Thread.sleep(100);
  31.                                         } catch (InterruptedException e) {
  32.                                         }
  33.                                         Log.i(TAG, "myservice running " + (msec+=100) + "ms.");
  34.                                 }
  35.                         }
  36.                 }).start();
  37.         }
  38.         @Override
  39.         public void onDestroy() {
  40.                 bThreadRunning = false;
  41.                 super.onDestroy(); // 可以不用
  42.         }
  43. }
复制代码

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>
复制代码


你可能感兴趣的:(android)