2015-5-9

1.服务是什么

android四大组件之一,有一些特点:

1)服务的运行不依赖于用户界面,即使程序被切换到后台、或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。(当对应的程序关闭了呢?)

2)服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当该进程被杀掉时,所有依赖于该进程的服务也会停止运行。

3)服务并没有自动开启一个线程,其代码是默认运行在主线程中的。也即,我们需要在服务的内部手动创建子线程,并在当中执行具体的任务。以免出现主线程被阻塞的情况。(IntentService除外)

2.Android多线程编程

2.1线程的基本用法

2.2利用异步消息处理机制在子线程中更新UI(不可以直接在子线程中跟新UI,只能在主线程中更新UI,否则会出现异常)

2.3解析异步消息处理机制

2.4使用AsyncTask

3.服务的基本用法

3.1定义服务

1)创建myService类,使其继承Service类,

2)再实现onBind()方法(用于活动和服务的绑定),重写onCreate()(服务创建时调用)、onStratCommand(服务启动时调用)、onDestroy()方法(服务销毁时调用)。

3)每一个服务(事实上是四大组件)都需在AndroidManifest.xml中注册才能生效

3.2启动和停止服务

借助Intent。

启动:

 Intent startIntent = new Intent(this,myService.class);
startService(startIntent);//启动服务

首次执行startService(startIntent)后,myService中的onCreate()方法、onStratCommand()方法会依次执行。

而之后再执行startService(startIntent)(执行stopService()之后?还是直接再次执行startService()?),只有onStratCommand()方法会执行。

因为该服务已经创建过了,就不执行onCreate()方法了。

停止:

1.

 Intent stopIntent = new Intent(this,myService.class);
stopService(startIntent);//停止服务

onDestroy()方法会执行。

2.

或者,服务也可以自己使自己停止下来,即在myService类中的某个位置调用stopSelf()方法也能停止服务。

3.3活动和服务进行通信

利用myServiece类中的onBind()方法。

//...

4.服务的生命周期

1.startService()----stopService()/stopSelf()

2.bindService()----unbindService()

3.startService() && bindService() ---- stopService() && unbindService() (?:或者直接stopSelf(),没试验过)

5.服务的更多技巧

5.1使用前台服务

前台服务与普通服务(即后台服务)的两点主要的区别在于,

1)当系统出现内存不足的情况时,可能会回收后台服务,而不会回收前台服务。

2)后台服务是默默运行,看不到的。而前台服务会一直有一个正在运行的图标在系统的状态栏显示,下拉后可以看到详细信息,类似通知的效果。比如墨迹天气就是运用这一点。

用法:在myService()的onCreate()方法中利用通知+startForeground()方法。

//具体code查书吧。

5.2使用IntentService

服务中的代码是默认运行在主线程中的,所以如果直接在服务中进行一些耗时的操作,就很容易出现ANR(Application Not Responding)情况。

处理方法一是,多线程+执行完毕后自动停止

 public class myService extends Service{
@override
public IBinder onBind(Intent intent){
return null;
} @override
public int onStartCommand(Intent intent,int flags,int startId){
new Thread( new Runnable(){
@override
public void run(){
//处理具体的逻辑
stopSelf();
}
}).start();
return super.onStartCommand(intent,flags,startId);
}
}

处理方法二是,不用考虑多线程和处理完毕后自动停止,IntentService类就自己实现了这两个功能。

 public class myIntentService extends IntentService{

     public myIntentService(){
super("myIntentService");//调用父类的有参构造函数
} @override
protected void onHandleIntent(Intent intent){
//处理具体的逻辑
//打印当前线程的id
Log.d("myIntentService","Thread id is " + Thread.currentThread().getId());//可以发现和主线程的线程id不太
} @override
public void onDestroy(){
super.onDestroy();
Log.d("myIntentService","onDestroy executed");//可以发现这个方法会自动执行,即使没有调用stopService()或stopSelf()方法。
}
}

6.服务的最佳实践-----后台执行的定时任务(即每隔一段时间就启动一次该服务,从而可以每隔一段时间就执行一次该服务的onStartCommand()方法。)

//code

大四实习准备6_android服务的更多相关文章

  1. 大四实习准备5_android广播机制

    2015-5-1 android 广播机制 5.1简介 分为标准广播(Normal broadcasts)(无先后顺序,几乎同时接收,不可截断)和有序广播(Ordered broadcasts)(有先 ...

  2. 大四实习准备4_java内部类

    2015-4-30 [昨天又可耻地休息了一天,懒劲比较大啊.跟懒劲有直接关系,这几天对幸福的感知也黯淡了,对未来的幸福不是那么渴望了.表现在对亲情和爱情上. 我想生活的本意是积极进取.茁壮生长并时常感 ...

  3. 大四实习准备3_java多线程

    4.25.27无耻地懒散了.....26号陪女朋友去了.今天28号,继续加油! 2015-4-28 Java 多线程 (java中类不能多继承,可以多层继承:接口则都可以) 定义和创建: 方法一:继承 ...

  4. 大四实习准备2_java异常处理_android控件练习

    2015-4-24 Java 异常处理 可以有多个catch;ArrayIndexOutOfBoundsException类是Exception类的子类RuntimeException类的一个间接子类 ...

  5. 大四实习准备1_java构造器_android ListView

    2015-4-23 Java构造器 与类名同名;无返回值(void也不行);被不同的修饰符修饰是有区别的;当构造函数被private修饰时,只有本类可访问.其他类可以通过该类的get函数得到对象.如单 ...

  6. OneAPM x 腾讯 | OneAPM 技术公开课·深圳 报名:前端性能大作战!

    「 OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点. 11月28日,OneAPM 技术公开课第 ...

  7. 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View

    (本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...

  8. java常见面试题目(一)

    在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...

  9. 【高软作业2】:Java IDE调研分析

    一 序言 随着软件项目开发需求的增多,拥有一款优秀的.顺手的IDE(Integrated Development Environment)对程序员来说显得格外重要.本文就Java程序开发,选择了3款I ...

随机推荐

  1. pdf转chm的实现方法

    相比pdf, CHM电子书在Windows系统下不需要安装额外的浏览器即可进行阅读,其内容是基于浏览器的风格,更容易被用户所接受.而且, 具有更强大的功能配置,比如可提供强大的全文搜索.索引.书签等的 ...

  2. Python 中的引用和类属性的初步理解

    最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅. 首先有一点是明确的:「Python 中一切皆对象」. 那么,这到底意味着什么呢? 如下代码: #!/usr/bin/env py ...

  3. WPF ListBox的DataTemplate例子

    <ListBox Name="lbLogInfo"> <ListBox.ItemTemplate> <DataTemplate> <Gri ...

  4. PAT乙级真题1005. 继续(3n+1)猜想 (25)(解题)

    原题: 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证 ...

  5. Nginx简单性能调优

    Nginx默认没有开启利用多核CPU (忍不住吐槽,然怪总感觉服务器性能没充分发挥), 我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU.CPU是任务处理,计算最关键 ...

  6. PHP webserver 之 soap non-wsdl

    non-wsdl 顾名思义就是不使用wsdl文件进行的webserver服务 事实上个人觉得用wsdl模式还不如使用non-wsdl模式,wsdl模式稍加麻烦! 1.网站运行环境下开启soap模块(p ...

  7. sql之解决数据库表的循环依赖问题

    三张数据表关系如图: 其实出现表循环依赖情况:就是 同时  ConfigCompany和 Department 也有依赖,就会报错,说有循环依赖,就会报错. 所以 这个时候的解决办法:可以改 在数据库 ...

  8. hdu 4710 Balls Rearrangement()

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 [code]: #include <iostream> #include <cstdio ...

  9. Discuz云平台站点信息同步失败,An unknown error occurred. May be DNS Error.

    站点信息同步失败 An unknown error occurred. May be DNS Error. (ERRCODE:1) 经过Discuz教程网(http://www.1314study.c ...

  10. 用IDEA调试Play工程

    IDEA的版本是14.0.1,运行在MAC OS X Yosemite上. IDEA已经装了Scala插件,但是在新建工程中,Scala的选项中并没有Play框架,不知道什么原因. 导入Play工程 ...