作为Android四大组件之一,service在每一个应用程序中都扮演着非常重要的角色。它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候
我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。
一、新建一个service
新建一个service很简单,只需要让我们自定义的MyService继承Service类并复写主要的几个方法(onCreate()、onStartCommand()、onDestroy()、onBind())即可。
二、开启和关闭一个service
1.点击按钮开启service
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent); 此时 onCreate()、onStartCommand() 方法会依次执行,再次点击 onStartCommand() 方法会再次执行,而onCreate()不会
2.点击按钮停止service
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent); onDestroy()方法会被执行。
说到这里我们只是单单开启了一个服务做一些耗时的工作,但是在activity中我们并不知道service中的工作做的怎么样了,比如任务的进度,任务的持续时间等等和该任务相关
的信息。为了加强service和activity的联系引入 绑定service --bindService。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
这里需要传入三个参数 第一个 intent就不说了,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在
Activity和Service建立关联后自动创建Service(一般会默认选择此标志位)
我们回到上面 创建ServiceConnection的地方 这里需要复写两个方法 onServiceDisconnected 、onServiceConnected
当service和activity断开连接和建立连接时会分别调用这两个方法。
public void onServiceConnected(ComponentName name, IBinder service)
中service是从onBind()方法return过来的,我们拿到这个实例即可在activity中调用MyService中的方法,达到activity和Service通信的目的。
例如:
public class MyService extends Service {
public static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload() executed");
}
}
}
activity中拿到IBinder 实例调用service中的方法。
public class MainActivity extends Activity implements OnClickListener {
private Button startService;
private Button stopService;
private Button bindService;
private Button unbindService;
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button) findViewById(R.id.start_service);
stopService = (Button) findViewById(R.id.stop_service);
bindService = (Button) findViewById(R.id.bind_service);
unbindService = (Button) findViewById(R.id.unbind_service);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
break;
case R.id.stop_service:
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
break;
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
}
如上面的代码解除绑定只需: unbindService(connection);
另外一种情况既点击了startService 和bindService需要 在绑定的activity不被销毁的情况下stopService(stopIntent) 和unbindService(connection) 都执行后 service才会被销
毁。 如果绑定的activity被销毁 对应的绑定的service也会被销毁。
那有没有一种service 在执行完我们需要的任务后就自动销毁呢?答案是肯定的它就就是 IntentService
IntentService是继承service 并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务
执行完后,IntentService会自动停止,而不需要我们手动去控制或stop。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的
onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
远程Service 它的坑比较多,一般能不用就不用,如果有兴趣的小伙伴可以百度
Android Service完全解析,关于服务你所需知道的一切(下)
小伙伴发现有问题的地方请及时提出来,大家一起学习
O(∩_∩)O谢谢!