针对Android四大组件之一的service做了一些细节的说明,本篇主要针对Android Service学习(一)作一些补充。
补充1
android的后台指的是运行是不依赖于UI界面的,即使activity被销毁或者APP被关闭,只要进程还在,service就可以继续运行,这一点依赖于service的线程是运行在APP的进程中的主UI线程。
Thread:用于开启一个子线程去执行一些比较耗时的操作,如下载等。之所以选择在service中新建一个线程而不是在activity中建立,是因为activity很难对thread进行控制,当activity被销毁,就没有办法重新获得之前创建的线程的实例,此外,在一个A activity创建的子线程,在另一个B activity是无法对A创建的子线程进行操作的。而所有的activity都可以与service进行绑定,然后就可以操作其中的方法,即使activity被销毁,之后只要重新与service进行绑定,就可以重新获取service中的Binder实例,不需要担心无法对后台控制的问题,activity也就可以放心的finish();
常用的service可以被写成:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG,"onStartCommand excused");
new Thread(new Runnable() {
@Override
public void run() {
//开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
//具体的Binder实例
public class MyBinder extends Binder {
public void startDownLoad(){
Log.e(TAG,"开始下载");
new Thread(new Runnable() {
@Override
public void run() {
//执行具体的耗时的下载任务
}
}).start();
}
}
补充2
针对service的开启和停止,通过以下log来具体的展示:
1. 开启
使用startService(intent)开启服务,调用log如下:
com.example.slide_table E/MyService:on Create excused
com.example.slide_table E/MyService:onStartCommand excused
com.example.slide_table E/MyService:onDestroy excused
使用bindService(intent)绑定服务,调用log如下:
com.example.slide_table E/MyService: on Create excused
com.example.slide_table E/MyService: 开始下载
com.example.slide_table E/MyService: onDestroy excused
如上log的结果,在调用bind绑定服务的时候并不会执行onStartCommand()函数。
2. 停止
使用startService(intent)开启服务,然后接着点击bindService(intent),单独的点击stopService(intent)或者unbind(connection)都不会停止service,只有在点击stopService(intent)后紧接着点击unbind(connection),或者点击unbind(connection)紧接着点击stopService(intent)才会销毁该service。
即:点击stop按钮只会让service停止,点击unbind按钮只会让service和activity解除绑定,一个service只有在既没有和任何activity绑定的时候且又处于停止状态的时候才会被销毁。
具体的log如下:
com.example.slide_table E/MyService: on Create excused//使用start开启
com.example.slide_table E/MyService: onStartCommand excused
com.example.slide_table E/MyService: 开始下载//点击bind按钮
com.example.slide_table E/MyService: 停止线程//点击stop按钮
com.example.slide_table E/MyService: onDestroy excused//点击unbind按钮
com.example.slide_table E/MyService: on Create excused
com.example.slide_table E/MyService: onStartCommand excused
com.example.slide_table E/MyService: 开始下载
com.example.slide_table E/MyService: 解除绑定//点击unbind按钮
com.example.slide_table E/MyService: 停止线程//点击stop按钮
com.example.slide_table E/MyService: onDestroy excused
Android service的分享学习暂且告一段落,后续还会根据项目中实际遇到的service的应用作说明,分析。如即将撰写的关于Android蓝牙开发中遇到的service的应用。
以上博客中关于分享的知识点或者遇到的问题,以及不正确的地方还请帮忙指出,谢谢。。。
网友评论