1. Service和Thread关系
Thread:
用于开启子线程,在里边执行耗时操作,不会阻塞主线程;
Service:
1>:Service 与 MainActivity一样,都是运行在主线程;
2>:Service 用于处理后台任务,由于 Service运行在主线程,如果执行耗时操作,会ANR,可以在 Service中 开启子线程,就可以处理后台的 耗时任务;
3>:后台指的是: 它的运行完全不依赖UI,即使 Activity被销毁、或者程序关闭,只要进程还在,Service就能运行。比如一些需求:需要与服务器之间一直保持心跳连接,就可以用 Service,直接在 Service中 开启子线程即可;
2. 为什么在Service开启 子线程?
同样是开子线程,为什么要用 Service而不用 MainActivity,原因是:
Activity销毁后,不能获取到之前创建的 Thread实例,而且 Activity中创建的 Thread实例,其他Activity不能对其操作;
但是 Service就不一样:
因为 所有 Activity都可以与 Service关联,即使 Activity销毁,只要 调用 bindService 重新 与 Activity 绑定,就可以 获取到 Service中的 Binder 实例,直接处理后台逻辑,Activity只管 finish,不用管后台执行的任务;
代码如下:
/**
* ================================================
* 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") ;
// 主线程
Log.e("TAG" , "MyService thread id is " + Thread.currentThread().getId()) ;
}
/**
* 在 MyService 中开启子线程
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TAG" , "onStartCommand__executed") ;
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
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__模拟在后台下载任务") ;
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
}
}
}
网友评论