一、简介
Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
注意:服务在其托管进程的主线程中运行;除非另行指定,否则服务不会创建自己的线程,也不会在单独的进程中运行。您应在服务内的单独的线程上运行任何阻塞操作,以免发生“应用无响应”(ANR) 错误。
二、生命周期
service_lifecycle.pngonCreate() :
首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。
onStartCommand() :
当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。
onDestroy() :
当服务不再使用且将被销毁时,系统将调用此方法。
onBind() :
当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法,并且需要返回一个Binder实例。 onBind()方法是必须重写的,即使我们用不到。调用startService()时返回null。
onUnbind() :
当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。
三、使用方法
第一步:创建一个自定义MyService类继承Service,重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()、onUnbind()方法。
package com.example.myapplication;
import android.app.Service;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service {
private String TAG = "MyService";
//创建字符串变量
private String name;
public String getName() {
return name;
}
public MyService() {
}
public class MyBinder extends Binder {
MyService getService () {
return MyService.this;
}
}
@Override
public void onCreate() {
Log.i(TAG,"onCreate");
name = "这是一个服务";
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand");
Toast.makeText(this, "服务已开启!", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind");
Toast.makeText(this, "服务已绑定!", Toast.LENGTH_SHORT).show();
return new MyBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(this, "服务已解除绑定!", Toast.LENGTH_SHORT).show();
Log.i(TAG,"onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Toast.makeText(this, "服务已关闭!", Toast.LENGTH_SHORT).show();
Log.i(TAG,"onDestroy");
super.onDestroy();
}
}
第二步:在清单文件 AndroidManifest.xml 里面注册该服务组件。
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
第三步:启动服务
Service的启动方式主要有两种,分别是startService和bindService。其中,startService使用的是同一个Service,因此onStart()会执行多次,onCreate()只执行一次,onStartCommand()也会执行多次。使用bindService启动时,onCreate()与onBind()都只会调用一次。
使用startService启动时是单独开一个服务,与Activity没有任何关系,而bindService方式启动时,Service会和Activity进行绑定,当对应的activity销毁时,对应的Service也会销毁。
1、startService方法
//开启
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
//关闭
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);
2、bindService方法
绑定服务的使用场景:需要绑定组件的时候,比如绑定Activity,和组件进行数据的传递和交互需要用到绑定服务。
首先需要在onBind方法返回一个Binder实例。
public class MyBinder extends Binder {
MyService getService () {
return MyService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind");
Toast.makeText(this, "服务已绑定!", Toast.LENGTH_SHORT).show();
return new MyBinder();
}
然后在MainActivity中创建连接服务的组件ServiceConnection类,重写onServiceConnected()、onServiceDisconnected方法()。通过调用MyBinder类中的public方法来实现Activity与Service的联系。
public class MyServiceConn implements ServiceConnection {
//当服务连接成功回调
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
isConn = true;
//获取中间人对象Binder
MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
//通过MyBinde的getService方法获取绑定的服务
MyService myService = myBinder.getService();
//获取服务里面的name变量
String nameValue = myService.getName();
Log.e(TAG, "onServiceConnected: " + nameValue);
}
//失去连接回调
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "onServiceDisconnected: " + componentName);
isConn = false;
}
}
接着就是调用bindService绑定服务。
Intent intent = new Intent(MainActivity.this,MyService.class);
myServiceConn = new MyServiceConn();
bindService(intent, myServiceConn,BIND_AUTO_CREATE);
//第一个参数:Intent对象
//第二个参数:上面创建的Serviceconnection实例
//第三个参数:标志位
//这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service
最后解绑服务
unbindService(myServiceConn);
网友评论