1.概念:
(1).Service可以说是一个在后台运行的Activity。它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了。
(2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示。
(3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用。
2.作用:
(1).它用于处理一些不干扰用户使用的后台操作。如下载,网络获取。播放音乐,它可以通过Intent来开启,同时也可以绑定到宿主对象(调用者例如Activity上)来使用。
(2).如果说Activity是显示前台页面的信息,那么Service就是在后台进行操作的。如果Service和前台UI进行交互的话可以通过发送广播或者通知栏的方式。
2.Service的生命周期
图片来自网络:
注意:本地服务中,onStart已经被onStartCommand方法取代
Service有两种启动方式:
1.通过startService()开启服务
生命周期:
第一次开启服务:onCreate()-->onStartCommand()
除了第一次以后每一次开启服务都是:onStartCommand()通过startService()开启的服务,只能通过stopService()方法结束
2.bindService开启服务:将服务的生命周期和调用者的生命周期绑在一起
第一次开启服务:onCreate()-->onBind()
第二次之后的每一次:什么都不执行
通过bindService开启的服务一定要在activity销毁的时候或销毁前解绑,并且绑定一次解绑一次,不能多次解绑
startService开启服务、bindService开启服务的区别:
startService开启服务只能通过stopService()结束
bindService和activity生命周期绑在一起
bindService可以实现与调用者的交互(Activity和广播可以开启Service)
startService:一般用于后台下载
bindService:一般用于音乐播放器
下面是实现的具体代码:
/**
* service与activity交互的步骤
* 1.在service中创建Binder的实现类(编写一个类继承Binder)
* 2.在实现类中写具体方法
* 3.在onBinder方法中返回实现类的对象
* 4.在调用者中声明Binder实现类的对象
* 5.在onServiceConnected中拿到Binder对象
* 6.调用Service中的方法
*/
MainActivity:
public class MainActivity extends AppCompatActivity {
Button but_start, but_stop, but_bind, but_unbind, but_myExample,but_link;
MyServiceConnection conn;
MyService.MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**开启服务*/
// startService(new Intent(MainActivity.this, MyService.class));
conn = new MyServiceConnection();
init();
}
private void init() {
but_start = (Button) findViewById(R.id.but_start);
but_stop = (Button) findViewById(R.id.but_stop);
but_bind = (Button) findViewById(R.id.but_bind);
but_unbind = (Button) findViewById(R.id.but_unbind);
but_myExample = (Button) findViewById(R.id.but_myExample);
but_link= (Button) findViewById(R.id.but_link);
but_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**开启服务*/
startService(new Intent(MainActivity.this, MyService.class));
}
});
but_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**停止服务*/
stopService(new Intent(MainActivity.this, MyService.class));
}
});
but_bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**绑定服务
* 参数一:Intent service
* 参数二:ServiceConnection conn 监听服务连接状态
* ServiceConnection 是一个接口 需要写一个类实现它
* 参数三:int flags :连接的方式
* Service.BIND_AUTO_CREATE自动创建连接*/
bindService(new Intent(MainActivity.this, MyService.class), conn, Service.BIND_AUTO_CREATE);
}
});
but_unbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**解绑服务*/
unbindService(conn);
}
});
//例子
but_myExample.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myBinder.myExample();
}
});
//连用
but_link.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启
Intent intent=new Intent(MainActivity.this, MyService.class);
startService(intent);
//绑定
bindService(intent,conn,Service.BIND_AUTO_CREATE);
}
});
}
public class MyServiceConnection implements ServiceConnection {
//服务连接
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
}
//服务未连接
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
//销毁
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
MyService:
public class MyService extends Service {
//第一次开启服务时调用
@Override
public void onCreate() {
super.onCreate();
Log.i("MyService", "onCreate");
}
//绑定
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("MyService", "onBind");
return new MyBinder();
}
//解绑
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
//开始
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
//销毁
@Override
public void onDestroy() {
super.onDestroy();
Log.i("MyService", "onDestroy");
}
public void examples() {
Toast.makeText(this, "我是例子examples", Toast.LENGTH_SHORT).show();
}
public class MyBinder extends Binder{
public void myExample(){
examples();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/but_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启"/>
<Button
android:id="@+id/but_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"/>
<Button
android:id="@+id/but_bind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定"/>
<Button
android:id="@+id/but_unbind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解绑"/>
<Button
android:id="@+id/but_myExample"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="例子"/>
<Button
android:id="@+id/but_link"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启和绑定"/>
</LinearLayout>
参考地址:http://www.3lian.com/edu/2015/06-06/219880.html