Android中的Service使用

35
回复
1291648
查看
[复制链接]

328

主题

383

帖子

4629

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2011-10-5 16:16:35 | 显示全部楼层 |阅读模式
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>
复制代码


点评

学习了  发表于 2012-12-23 17:46

0

主题

97

帖子

78

安币

程序猿

Rank: 2

发表于 2012-1-8 13:21:38 | 显示全部楼层
向上向上继续向上。。。

点评

【小国】http://www.59nh.com 邪恶漫画、邪恶动态图,想要就来   发表于 2015-6-19 14:32

3

主题

151

帖子

145

安币

攻城狮

Rank: 3Rank: 3

发表于 2012-2-6 10:20:10 | 显示全部楼层
楼主辛苦了

3

主题

128

帖子

499

安币

攻城狮

Rank: 3Rank: 3

QQ达人

发表于 2012-6-27 11:10:00 | 显示全部楼层
楼主辛苦了

1

主题

10

帖子

26

安币

初级码农

Rank: 1

发表于 2012-6-27 15:11:50 | 显示全部楼层
还不错,学习了{:Big Chin 2:}

0

主题

40

帖子

33

安币

初级码农

Rank: 1

QQ达人

发表于 2012-8-9 11:01:38 | 显示全部楼层
楼主辛苦了,{:Skateboard:}

0

主题

23

帖子

206

安币

攻城狮

Rank: 3Rank: 3

QQ达人

发表于 2012-8-31 23:04:14 | 显示全部楼层
{:soso__8961432591078930798_3:}

13

主题

727

帖子

407

安币

攻城狮

Rank: 3Rank: 3

QQ达人

QQ
发表于 2012-9-11 00:04:41 | 显示全部楼层
学习!{:Snicker:}
走下去,不管如何!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )