Service后记与拓展
来源:互联网 发布:js 汉字比较 编辑:程序博客网 时间:2024/06/10 08:55
使用细节
1.在注册服务的时候,为了将service纳入编译系统,必须在AndroidMainfest.xml中对Service进行显式声明。
2.计算量较大的又不是UI层的工作的话,可以选择放置在Service中进行工作。
3.通过开发文档你会发现,Android中的Service与宿主(调用者)在同一线程,而不是专门起一条线程,这意味着,如果你的服务要CPU密集型操作(如:MP3播放)或则阻塞操作(如网络)时,必须产生它自己的线程来完成这个工作,否则会造成线程阻塞。在Service的子类里面,IntentService类服务可以作为一个标准的实施,它的工作有其自己的线程。
4.如果在使用Service的时候又使用了广播接收器配合工作,广播如果是动态注册的话,在服务停止的时候记得调用unregisterReceiver(receiver);这个方法来注销掉接收器
拓展
1.如何检查Android后台服务线程(Service类)是否正在运行
Android系统自己提供了一个函数ActivityManager.getRunningServices,可以列出当前正在运行的后台服务线程
private boolean isServiceRunning() { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if ("com.example.MyService".equals(service.service.getClassName())) { return true; } } return false; }
2.Service与UI之间的通信方式
(1)使用直接启动的startService实现信息传递
流程:UI ——>Service
操作:使用Intent进行数据传递,通过服务中的onStartCommand方法进行接受(和Activity间传递方式一样)
(2)使用绑定启动的bindservice实现信息传递(
流程:UI ——>Service
Broadcast(广播)进行信息的双向传递
流程:UI <——>Service
操作:注册绑定广播接受器,之后通过广播来进行2者间通信
注意:在服务退出的时候记得unregisterReceiver(receiver);注销广播接收器
3.Service和Thread的区别
我们拿服务来进行一个后台长时间的动作,为了不阻塞线程,然而,Thread就可以达到这个效果,为什么我们不直接使用Thread去代替服务呢?(这个问题摘抄至网上,原文地址不是是哪个,所以没写上)
这里提下,
1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!
既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。
因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。
利用服务
另外,使用AIDL方式的Service(进行跨进程通信),以后会继续跟进博客的。
- Service后记与拓展
- 拓展培训后记--过雷区
- Remote Service拓展
- 后记
- 后记
- 后记:
- 后记
- 中国古代兵器与兵书·后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 《.NET软件技术学习与实践》后记
- 欧几里德与拓展欧几里德
- 拓展训练小结与感悟
- 对话框的收缩与拓展
- LightOJ 1011 - Marriage Ceremonies(状压DP)
- 欢迎使用CSDN-markdown编辑器
- CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器
- 移植libusb到mips-linux上(基于jz4780)
- 学习笔记(一)
- Service后记与拓展
- 查询重复的SQL语句
- 完美旅行APP
- Java面向对象编程学习
- linux命令
- 用函数做形参
- Shell脚本:判断当前目录下所有的文件类型
- androidTV 电视桌面的效果
- 一大代表刘仁静的故事