Service
Service是什么?
1,Service是一个应用程序组件,它用来后台完成一个 时间跨度比较大 的工作且 没有任何关联界面
2,service可以完成下面这些工作:
访问网络
播放音乐
文件IO操作
大数据的数据库操作
3,服务的特点:
- service在后台运行,不能与用户进行交互
- 即使应用退出,服务也不会停止
- 在默认情况下,service运行在应用程序的主线程中,如果需要service处理一些网络连接等耗时操作,那么应该将这些任务放在分线程中处理,避免阻塞用户界面
(总结下上面的:“服务”也就是说,当你关闭的应用时(不是清理进程),你的activity是死掉的,但是你的服务(不是绑定启动)还在后台运行。如果绑定启动的话,就是随activity一起死去。)
Service的分类:
1,本地服务LocalService
- Service对象与Service的启动者在同个进程中运行,两者的通信是进程内通信
2,远程服务RemoleService
- Service对象与Service的启动者不在同个进程中运行,这时存在一个进程间通信的问题,Android专门为此设计了AIDL来实现进程间的通信
启动与停止服务:
1,方式一:一般启动
- context.startService(Intent intent)
- context.stopService(Intent intent)
2,方式二:绑定启动
- 1,context.bindService(Intent intent,ServiceConnection connection)
- 2,context.unbindService(ServiceConnection connection)
先上布局截图吧(代码应该不需要上了吧…):
步骤也就是首先要创建一个继承Service的子类:
public class MyLocalService extends Service {
public MyLocalService(){
Log.e("TAG","MyService()");
}
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG","MyService onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG","MyService onDestroy");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("TAG","MyService onBind");
return new Binder();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TAG","MyService startCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("TAG","MyService onUnBind");
return super.onUnbind(intent);
}
}
因为它是Context的子类(activity也是context的子类),所以它可以用context的方法(onCreate(),onDestroy(),StartCommand(Intent intent, int flags, int startId))可以来测试声明周期。
main代码:
public class MainActivity extends AppCompatActivity {
private Button btn_1,btn_2,btn_3,btn_4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_1=(Button)findViewById(R.id.btn_1);
btn_2=(Button)findViewById(R.id.btn_2);
btn_3=(Button)findViewById(R.id.btn_3);
btn_4=(Button)findViewById(R.id.btn_4);
}
//启动服务
public void startMyService(View view){
Intent intent=new Intent(this,MyLocalService.class);
startService(intent);
Toast.makeText(this,"start seervic",Toast.LENGTH_SHORT).show();
}
//停止服务
public void stopMyservice(View view){
Intent intent=new Intent(this,MyLocalService.class);
stopService(intent);
Toast.makeText(this,"stop service",Toast.LENGTH_SHORT).show();
}
private ServiceConnection sc;
//绑定启动
public void bindService(View view){
//判断activity是否绑定服务
if(sc==null) {
Intent intent = new Intent(this, MyLocalService.class);
sc = new ServiceConnection() {
//创建连接对象时启动
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("TAG", "onServiceConnected()");
}
//当服务断开时
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG", "onServiceDisconnected()");
}
};
//绑定服务
bindService(intent, sc, BIND_AUTO_CREATE);
Toast.makeText(this, "bind service", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "已经bind service", Toast.LENGTH_SHORT).show();
}
}
//解除绑定
public void unbindService(View view){
if(sc!=null) {
unbindService(sc);
//如果不设置null,即使解除了绑定,activity也绑定不了服务
sc=null;
Toast.makeText(this, "unbindservice", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "未bind service", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(sc!=null){
unbindService(sc);
sc=null;
}
}
}
下面代码的意思是:我们关闭页面前运行这个方法。这里的用途是,如果我们绑定启动,当我们未解除绑定就关掉页面,那么会出现内存泄露(好像是内存泄漏吧)。所以我们在关掉页面时,我们判断是否解除绑定,若未解除绑定,则解除绑定。
@Override
protected void onDestroy() {
super.onDestroy();
if(sc!=null){
unbindService(sc);
sc=null;
}
}
最后经过测试,各方法创建服务的生命周期为:
1,startService()
- 第一次调用:构造方法()->onCreate()->onStartCommand()
- (重要)后面再调用:->onStartCommand()
2,stopService():
- ->onDestory()
3,bindService():
- 调用:构造方法()->onCreate()->onBind()->onServiceConnected()
4,unbindService:
- 调用:(当前只有Activity与Service连接)->onUnbind()->onDestory()