Service(二) - Service与Activity通信
2019-01-27 本文已影响0人
世道无情
1. Service与Activity通信
上篇文章记录了 Service应用场景、startService开启服务、stopService停止服务,在开启服务之后就可以在 onCreate()、onStartCommand()方法中执行一些逻辑;
MyService中的 onBind()方法,作用就是Activity与Service关联
图片.png
2. 代码如下
1>:MyService代码如下:
/**
* ================================================
* Email: 2185134304@qq.com
* Created by Novate 2018/12/18 15:09
* Version 1.0
* Params:
* Description:
* 备注:任何一个 Service在整个应用程序范围内都是通用的,也就是说 MyService 不仅可以和ServiceActivity关联,
* 还可以和任何一个Activity关联,而且在关联时都可以获取到相同的 MyBinder实例
* ================================================
*/
public class MyService extends Service {
// 自己自定义MyBinder继承Binder
private MyBinder mBinder = new MyBinder() ;
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG" , "onCreate__executed") ;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TAG" , "onStartCommand__executed") ;
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG" , "onDestroy__executed") ;
}
/**
* Activity 与 Service关联,返回 MyBinder实例对象:
* 用于在 Activity中,通过onServiceConnected方法,指定 Service执行相关任务
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder{
/**
* 自己自定义MyBinder继承Binder,然后随便定义一个方法,
* 用于在后台执行下载任务,这里只是做一个测试
*/
public void startDownload(){
// 模拟在后台下载任务
Log.e("TAG" , "startDownload__模拟在后台下载任务") ;
}
}
}
2>:ServiceActivity代码如下:
/**
* ================================================
* Email: 2185134304@qq.com
* Created by Novate 2018/12/18 15:37
* Version 1.0
* Params:
* Description: 在Activity中演示:启动服务StartService 与 StopService停止服务
* ================================================
*/
public class ServiceActivity extends AppCompatActivity implements View.OnClickListener {
private Button startService;
private Button stopService;
private Intent intent;
private Button bindService;
private Button unbindService;
private MyService.MyBinder myBinder ;
/**
* 创建匿名内部类,重写 onServiceConnected 和 onServiceDisconnected方法
*/
private ServiceConnection connection = new ServiceConnection() {
/**
* Activity 与 Service 建立关联调用
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 二者建立关联后,通过向下转型获取 MyBinder实例,有了这个实例,可以在Activity中根据具体场景,
// 调用 MyBinder 中任何 public 方法,实现了 Activity指挥Service干什么,Service就去干什么
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
/**
* Activity 与 Service 解除关联调用
*/
@Override
public void onServiceDisconnected(ComponentName name) {
}
} ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
startService = (Button) findViewById(R.id.start_service);
stopService = (Button) findViewById(R.id.stop_service);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
bindService = (Button) findViewById(R.id.bind_service);
unbindService = (Button) findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
// 启动服务
case R.id.start_service:
intent = new Intent(ServiceActivity.this , MyService.class);
startService(intent) ;
break;
// 停止服务
case R.id.stop_service:
Log.e("TAG" , "stopService__") ;
intent = new Intent(ServiceActivity.this , MyService.class);
stopService(intent) ;
break;
// 绑定服务:将 Activity与Service绑定,接收3个参数:
// param_1: intent对象
// param_2: 上边的 ServiceConnection实例对象
// param_3: 一个标志位,BIND_AUTO_CREATE表示Activity与Service建立关联后,自动创建Service
// 然后MyService中的 onCreate方法执行,但是 onStartCommand不会执行
case R.id.bind_service:
Intent intent = new Intent(ServiceActivity.this , MyService.class) ;
bindService(intent , connection , BIND_AUTO_CREATE) ;
break;
// 解绑服务:解除 Activity与Service的关联
case R.id.unbind_service:
Log.e("TAG" , "unBindService__") ;
unbindService(connection);
break;
}
}
}
点击 bindService:此时就可以绑定Activity与Service了;
点击 unBindService:此时就可以解除绑定了
3. 如何销毁Service
单独点击 startService 启动服务 和 stopService 停止服务:
onCreate__executed
onStartCommand__executed
onDestroy__executed
单独点击 bindService 绑定服务 和 unBindService 解绑服务:
onCreate__executed
onStartCommand__executed
onDestroy__executed
先点击 startService ,然后点击 bindService,然后点击 stopService和 unbindService停止服务和解绑服务:
如果先点击startService,然后点击 bindService,此时不管是点击 stopService还是 unbindService,服务都不会被销毁,要把两个都点击一下,Service才会被销毁;
给bindService 和 unbindService 添加两个日志,log如下:
onCreate__executed
onStartCommand__executed
startDownload__模拟在后台下载任务
stopService__
unBindService__
onDestroy__executed
4. 注意事项
1>:任何一个Service在整个项目中都是通用的,也就是说 MyService不仅可以和 MainActivity绑定,可以和任何一个Activity绑定,而且绑定后获取的都是相同的 MyBinder对象;
2>:在 MyService中的 onDestroy方法中清理不再使用的资源,防止 Service销毁后还有一些不再使用的 资源占用着内存;