必看Android 500道高薪面试题集 联系客服

发布时间 : 星期六 文章必看Android 500道高薪面试题集更新完毕开始阅读b71989bdbe23482fb5da4cad

IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService,IntentService通过workerthread处理每个Intent对象,执行完所有的工作之后自动停止Service。

说明:workerthread处理所有通过传递过来的请求,创建一个workerqueue,一次只传递一个intent到onHandleIntent中,从而不必担心多线程带来的问题。处理完毕之后自动调用stopSelf()方法;默认实现了Onbind()方法,返回值为null;

模式实现了哦你StartCommand()方法,这个方法会放到workerqueue中,然后在onHandleIntent()中执行0

使用IntentService需要两个步骤: 1、写构造函数

2、复写onHandleIntent()方法

好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求 用Service来处理后台耗时操作,却很少注意到还有个IntentService

首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方:

1.AServiceisnotaseparateprocess.TheServiceobjectitselfdoesnotimplyitisrunninginitsownprocess;unlessotherwisespecified,itrunsinthesameprocessastheapplicationitispartof.

2.AServiceisnotathread.Itisnotameansitselftodoworkoffofthemainthread(toavoidApplicationNotRespondingerrors).

稍微翻一下(英文水平一般)

1.Service不是一个单独的进程,它和应用程序在同一个进程中。

2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作

关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现ApplicationNotResponding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。

有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。

IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明: IntentServiceisabaseclassforServicesthathandleasynchronousrequests(expressedasIntents)ondemand.ClientssendrequeststhroughstartService(Intent)calls;theserviceisstartedasneeded,handleseachIntentinturnusingaworkerthread,andstopsitselfwhenitrunsoutofwork.

This\TheIntentServiceclassexiststosimplifythispatternandtakecareofthemechanics.Touseit,extendIntentServiceandimplementonHandleIntent(Intent).IntentServicewillreceivetheIntents,launchaworkerthread,andstoptheserviceasappropriate.

Allrequestsarehandledonasingleworkerthread--theymaytakeaslongasnecessary(andwillnotblocktheapplication'smainloop),butonlyonerequestwillbeprocessedatatime.

稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个workerthread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的

workerthread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:

31

1Service:

packagecom.zhf.service; importAndroid.app.Service; importAndroid.content.Intent; importAndroid.os.IBinder;

publicclassMyServiceextendsService{ @Override

publicvoidonCreate(){ super.onCreate(); }

@Override

publicvoidonStart(Intentintent,intstartId){ super.onStart(intent,startId);

//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作

System.out.println(\try{

Thread.sleep(20000);

}catch(InterruptedExceptione){ e.printStackTrace(); }

System.out.println(\睡眠结束\}

@Override

publicIBinderonBind(Intentintent){ returnnull; } }

2.IntentService:

packagecom.zhf.service;

importAndroid.app.IntentService; importAndroid.content.Intent;

publicclassMyIntentServiceextendsIntentService{ publicMyIntentService(){ super(\}

@Override

protectedvoidonHandleIntent(Intentintent){

//经测试,IntentService里面是可以进行耗时的操作的

//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个workerthread(线程)来处理队列中的Intent

//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个 System.out.println(\try{

32

Thread.sleep(20000);

}catch(InterruptedExceptione){ e.printStackTrace(); }

System.out.println(\睡眠结束\} }

测试主程序:

packagecom.zhf.service; importAndroid.app.Activity; importAndroid.content.Intent; importAndroid.os.Bundle;

publicclassServiceDemoActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override

publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main);

startService(newIntent(this,MyService.class));//主界面阻塞,最终会出现Applicationnotresponding

//连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)

startService(newIntent(this,MyIntentService.class)); startService(newIntent(this,MyIntentService.class)); } }

229. service的启动 230. 异步任务 231. 强引用

232. 新浪微博头像设置 233. 加密算法

MD5;SH1;双面解密

234. 高德地图

235. asynctask和handler的区别 236. 跳转图片释放

当前Activity包括多张图片当点击某一张图片跳转Activity时候之前Activity是否释放怎么释放的?

237. shareprefercnce保存用户名密码时候怎么加密 238. 离线下载怎么实现

239. 用过viewstub吗?include呢 240. android应用程序自启动

241. service是在主线程中吗?service中可不可以耗时操作 242. 数据库优化

33

243. socket 244. 屏幕适配

245. 关于图片压缩,用算法实现 246. 关于第三方分享 247. MVC在安卓的体现

248. surfaceview和VIEW和GLsurfaceview的区别 249. 都用过什么模式,经常用到的服务器是什么

250. 编写代码输入安卓abc汉字6字节输出安卓abc而不是安卓abc氵 251. 看一个for循环循环了几次

252. 怎杨跳出一个循环继续执行下一个循环 253. 使一个字符串逆序输出Stringa=abcde 254. 一个for循环,每次i+=2,截取字符串输出。 255. Math的操作,其实用了好几个方法,选择正确的结果 256. 线程的状态 257. 消息推送,xmpp轮询 258. udp/tcp 259. 动画

260. intent的几种模式

261. 分页加载,每页15条数据,拉到底部自动加载数据。 262. Android系统架构从小到大写

应用层:Java应用开发工程师开发的所有应用程序比如地图,浏览器,QQ等属于该层,手机中的短信,拨号,浏览器等这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个性化 应用框架层:Javaframework层源码OS定制开发为应用层开发人员提供API

系统运行库层:C语言包括C语言标准库,多媒体库,OpenGLES,SQLite,Webkit,Dalvik虚拟机等,该层是对应用框架层提供支持的层,Java访问硬件需通过NDK实现 Linux内核层:Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核

263. 用代码手写堆栈 264. 即时通讯

265. 多人聊天,视频,语音 266. 侧拉效果

267. 侧拉多界面,组件焦点

268. 别的公司封装好的播放器,从C中提取源码 269. AsyTask的三个参数是什么

270. finish()与System.exit(0)的区别,再谈谈你对退出的理解。

首先一个Activity是有生命周期onCreate,onStart,onResume,onPause,onStop,onDestroy... finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。

其次,android的机制决定了用户无法完全退出应用,当你的application最长时间没有被用过的时候,android自身会决定将application关闭了。 finish方法可以控制像Activity一样的组件,使其结束生命周期,但应用程序全局的资源并不会立刻释放,像static变量的值仍然会保留,保以再次使用。

34