Android四大组件之Service
一、什么是Service
把用时比较长的操作放到后台运行,不影响我们当前操作;无交互界面;
一般用在:网络访问、数据库访问、文件IO操作、大数据操作、音乐播放等。
Service在后台运行,不与用户进行交互。在默认情况下,Service运行在应用程序的主线程中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在单独的线程中处理,避免阻塞用户界面
二、Service和IntentService的区别
IntentService:进行异步请求 ,实现原理类handle
注:使用异步的原因是防止由于监听的事件发生很快很多,超成死机。
三、Service和BindService的区别
四、Service的生命周期
1、unbounded
onCreate()-->onStartCommand()-->onDestroy()
2、Bounded
onCreate()-->onBind()-->onUnbind()-->onDestroy()
五、ANR(Application Not Responding)
主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
BroadcastReceiver 没有在10秒内完成返回
解决方案如下:
逻辑应该是
1. new出一个新的线程,进行数据请求
2. 获取数据后,调用handler.sendMessage方法
3. 在handler的handle()方法中更新UI
private Thread mthread;
private Handler mhandler;
oncreate:
mthread = new Thread(runnable);//这里是在主线程中创建一个子线程,不会阻塞UI
mthread.start();
private Runnable runnable = new Runnable (){
void run(){
//做耗时的数据处理
//处理完毕
mhandler.sendEmptyMessge(1000);//这里发消息通知UI可以更新了
}
};
mhandler = new Handler(){
void handleMessgae(Message msg){
if(msg.what == 1000){
//更新UI
}
super.handlMessgae();
}
};
六、按照启动方式分为两种Service
1、Started:startService()来启动--->在后台运行---》只启动,无返回值---》通常网络上传或下载,操作完成后,自动停止
onStartCommand():
2、Bound:bindService()来绑定--》提供客户端服务器接口来启动---》发送请求,得到返回值,甚至通过IPC(linux进程之间的通讯机制)来通讯--》两者绑定,只要一个绑定,服务运行,所有绑定者退出,服务退出。
onBind()
七、adb shell连接android模拟器
ls显示目录结构
cd data进入文件夹
cd app进入app文件夹
cd。。返回到上一级文件夹
exit退出
adb install《路径》安装app
八、创建及使用Service的步骤
1、继承Service类实现自己的服务
2、在AndroidManifest中注册服务
3、启动服务startService()
停止服务:stopService()
4、stopSelf()
九、绑定及使用Service的步骤
1、继承Service或者IntentService类实现自己的服务
2、在AndroidManifest中注册服务
3、绑定服务bindService()
4、取消绑定服务unbindService()
十、Service 里的Binder机制是linux里的进程通信机制
十一、Service到前台运行的情况
1、Service后台运行风险,由于资源不够的时候被杀死。所以就会把服务设定为前台服务。比如音乐播放器,在后台播放的时候,我们就不希望被杀死。
2、实现如下startForeground(ONGOING_NOTIFICATION,notification);
详情见DOC 里的Services
十二、Native Service
1、什么是Native Service
涉及到系统库的服务设计开发,使用c、C++来实现
原生态服务
SDK-->android NDK插件
2、何时会用到Native Service
当前服务不能满足现有的需求时候就需要考虑使用本地库服务
3、如何调用
使用JNI(Java Native Interface) interface header
例如:放大效果实现、
十三、如何在Service和线程之间选择
Service是一个很方便的组件让你运行后台操作,并且不影响当前操作。
衡量独立业务性存在的必要
当你需要再你当前操作的时候另外起一个更独立操作时候可以考虑线程,比如当前程序不关闭的情况下运行音乐
有了 Service 类我们如何启动他呢,有两种方法:
• Context.startService()
• Context.bindService()
1. 在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。
2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。
总结:
1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。
2. bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。
由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。
与 Service 通信并且让它持续运行
如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。
提高 Service 优先级
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。
为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。
摘自网络其他资料:关于Service生命周
Android Service生命周期与Activity生命周期是相似的,但是也存在一些细节上也存在着重要的不同:
onCreate和onStart是不同的
通过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并且在onCreate方法之后调用它的onStart方法。如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。
onResume、onPause以及onStop是不需要的
回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。
onBind
如果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。
onDestroy
与Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。
转载于:https://blog.51cto.com/4789781/1172321