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


  • 相关阅读:
    hudson中 ANT 编译警告: 编码 UTF-8 的不可映射字符解决方法
    Jmeter与hudson,ant集成
    Hudson配置路径
    python 面向对象:封装---对象的属性可以是另一个类创建的对象
    python 面向对象:封装
    python3 f-string格式化字符串的高级用法
    iOS微信支付无法直接返回APP的问题
    学习git&github
    Appium之xpath定位详解
    selenium等待方式详解
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3535877.html
Copyright © 2020-2023  润新知