Service基本用法

来源:互联网 发布:企业网络需求分析报告 编辑:程序博客网 时间:2024/06/05 09:31

1.什么是Service

服务(Service) 是 Android 中实现程序后台运行的解决方案, 它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。 服务的运行不依赖于任何用户界面, 即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。

另外, 也不要被服务的后台概念所迷惑, 实际上服务并不会自动开启线程, 所有的代码都是默认运行在主线程当中的。 也就是说, 我们需要在服务的内部手动创建子线程, 并在这里执行具体的任务, 否则就有可能出现主线程被阻塞住的情况。 

2.自定义Service

创建一个类并让该类继承Service,并重写如下方法,即可实现自定义Service

package code.xzy.com.servicedemo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;/** * Function:自定义Service 继承自Service * Created by XZY on 2017/6/25 17:35 * Email:hgncxzy@qq.com */public class MyService extends Service {    private static final String TAG = "MyService";    @Override    public void onCreate() {        Log.i(TAG, "onCreate: executed");        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i(TAG, "onStartCommand:executed ");        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        Log.i(TAG, "onDestroy:executed ");        super.onDestroy();    }    @Override    public IBinder onBind(Intent intent) {        Log.i(TAG, "onBind: executed");        return null;    }    @Override    public boolean onUnbind(Intent intent) {        Log.i(TAG, "onUnbind:executed ");        return super.onUnbind(intent);    }}

3.启动Service与停止Service(绑定Service与解绑Service)

package code.xzy.com.servicedemo;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * Service的使用方法: * 1.定义一个Service * 2.启动服务/停止服务  绑定服务/解绑服务 * 3.服务的生命周期 * 4.活动和服务进行通讯 */public class MainActivity extends Activity implements OnClickListener {    private static final String TAG = "MainActivity";    private Button startService, stopService, bindService, unBindService;    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        intent = new Intent(MainActivity.this, MyService.class);        startService = (Button) findViewById(R.id.startService);        stopService = (Button) findViewById(R.id.stopService);        bindService = (Button) findViewById(R.id.bindService);        unBindService = (Button) findViewById(R.id.unBindService);        startService.setOnClickListener(this);        stopService.setOnClickListener(this);        bindService.setOnClickListener(this);        unBindService.setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.startService:                Log.i(TAG, "onClick: startService");                startService(intent);                break;            case R.id.stopService:                Log.i(TAG, "onClick: stopService");                stopService(intent);                break;            case R.id.bindService:                Log.i(TAG, "onClick: bindService");                bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);                break;            case R.id.unBindService:                Log.i(TAG, "onClick: unBindService");                unbindService(serviceConnection);                break;            default:                break;        }    }    private ServiceConnection serviceConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            Log.i(TAG, "onServiceConnected: ");        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            Log.i(TAG, "onServiceDisconnected: ");        }    };}
调用startService()后执行的方法:
06-25 18:00:51.259 20906-20906/code.xzy.com.servicedemo I/MyService: onCreate: executed06-25 18:00:51.259 20906-20906/code.xzy.com.servicedemo I/MyService: onStartCommand:executed 
调用stopService()后执行的方法;

06-25 18:00:56.689 20906-20906/code.xzy.com.servicedemo I/MyService: onDestroy:executed 

调用bindService()后执行的方法:

06-25 18:01:07.838 20906-20906/code.xzy.com.servicedemo I/MyService: onCreate: executed06-25 18:01:07.838 20906-20906/code.xzy.com.servicedemo I/MyService: onBind: executed

调用unBindService()后执行的方法:

06-25 18:01:19.525 20906-20906/code.xzy.com.servicedemo I/MyService: onUnbind:executed 06-25 18:01:19.526 20906-20906/code.xzy.com.servicedemo I/MyService: onDestroy:executed 

使用bindService/unBindService时,需要实例化一个ServiceConnection对象。

4.Service生命周期

一旦在项目的任何位置调用了 Context 的 startService()方法, 相应的服务就会启动起来,并回调 onStartCommand()方法。如果这个服务之前还没有创建过, onCreate()方法会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到 stopService()或stopSelf()方法被调用。
注意虽然每调用一次 startService()方法, onStartCommand()就会执行一次, 但实际上每个服务都只会存在一个实例。 所以不管你调用了多少次 startService()方法,只需调用一次 stopService()或 stopSelf()方法,服务就会停止下来了。另外,还可以调用 Context 的 bindService()来获取一个服务的持久连接,这时就会回调服务中的 onBind()方法。类似地,如果这个服务之前还没有创建过, onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到 onBind()方法里返回的 IBinder 对象的实例, 这样就能自由地和服务进行通信了。 只要调用方和服务之间的连接没有断开, 服务就会一直保持运行状态。

当调用了 startService()方法后,又去调用 stopService()方法,这时服务中的 onDestroy()方法就会执行,表示服务已经销毁了。类似地,当调用了 bindService()方法后,又去调用unbindService()方法, onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了 startService()方法,又调用了 bindService()方法的,
这种情况下该如何才能让服务销毁掉呢?根据 Android 系统的机制, 一个服务只要被启动或者被绑定了之后, 就会一直处于运行状态, 必须要让以上两种条件同时不满足, 服务才能被
销毁。 所以, 这种情况下要同时调用 stopService()和 unbindService()方法, onDestroy()方法才会执行。这样你就已经把服务的生命周期完整地走了一遍。