Service介绍:
Service是系统四大组件之一,它的后台运行并不是子线程,Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR。它不能在页面显示,只能在后台运行,可以与其他组件进行交互。Service的用途很广,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,官方给出Service的优先级挺高的,当内存不足的时候,保证Service尽量不被系统杀死。
下面是两种服务的生命周期:
绑定服务:
被绑定的service是当其他组件(一个客户)调用bindService()来创建的。客户可以通过一个IBinder接口和service进行通信。客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
下面是运行结果:
首先是下了两个按钮,点击的时候会在log打印出现,一个是点击绑定,一个是点击解绑
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/mBtn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BindService"
/>
<Button
android:id="@+id/mBtn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UNbindService"
/>
</LinearLayout>
写服务,必须要写一个类,然后继承自Service,同时别忘了在配置清单里面注册,如果一个Service在某个Activity中被调用bindService方法启动,不论bindService被调用几次,Service的onCreate方法只会执行一次,当建立连接后,Service会一直运行,除非调用unbindService来接触绑定、断开连接或调用该Service的Context不存在了(如Activity被Finish——即通过bindService启动的Service的生命周期依附于启动它的Context),系统在这时会自动停止该Service。
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class BindService extends Service{
private String tag="BindService";
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.e(tag, "onCreate");
}
@Override
public IBinder onBind(Intent intent) {
Log.e(tag, "onBind");
return new MyBind();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.e(tag, "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e(tag, "onDestroy");
}
public void getLast(){
Log.e("", "下一曲");
}
public class MyBind extends Binder{
public BindService getservice(){
return BindService.this;
}
}
}
实现绑定服务监听,必须实现ServiceConnection接口
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private Button mBtn1,mBtn2;
private Conn conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
conn=new Conn();
initView();
}
private void initView() {
mBtn1=(Button) findViewById(R.id.mBtn1);
mBtn2=(Button) findViewById(R.id.mBtn2);
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(R.id.mBtn1==v.getId()){
//绑定服务
Intent intent=new Intent(MainActivity.this, BindService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}else{
//服务解绑
unbindService(conn);
}
}
//绑定服务监听
private class Conn implements ServiceConnection{
//绑定服务成功的监听 service:是服务绑定成功后的返回值:onbund方法的返回值
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BindService.MyBind bind=(BindService.MyBind) service;
bind.getservice().getLast();
}
//因为异常,绑定服务失败的监听
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
非绑定服务
从图中可以看出,启动一次之后,onCreate方法已经不走了,直接走onStartCommand方法
只有停止服务之后,才会重新走创建这个方法
下面为非绑定服务代码,继承自Service,然后实现了非绑定服务的生命周期,onBind()方法是系统实现的,在这里不做任何操作。
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
public class MyService extends Service{
@Override
public void onCreate() {
Log.e("MyService","onCreate");
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("MyService","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e("MyService","onDestroy");
super.onDestroy();
}
}
在这里我在布局写了两个按钮,
第一个按钮是启动服务,
第二个按钮是退出的时候调用的stopService();关闭服务
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private Button mBtn1,mBtn2;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBtn1=(Button) findViewById(R.id.mBtn1);//启动服务
mBtn2=(Button) findViewById(R.id.mBtn2);
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.mBtn1:
intent=new Intent(MainActivity.this,MyService.class);
startService(intent);
break;
case R.id.mBtn2:
intent=new Intent(MainActivity.this,MyService.class);
stopService(intent);//在退出的时候关闭Service
break;
}
}
}