学习了一下Service,网上常见的一些就不说了,说一下感觉容易给人造成误解的地方
1. 如Service的创建都是在新进程创建的么?
其实不是的,在 Dev Guide中写道:
引用
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.
就是说,当创建一个Service的时候,默认是在Application的进程里主UI线程创建的,如果你在Service中进行阻塞的操作,会直接阻塞UI线程,可能导致五秒无响应的提醒,所以官方建议是在Service里面创建新的线程来防止阻塞放生。
2. 如何在新进程里创建Service?
一般的方法就是在manifast中声明Service的时候,使用process标签,注明所使用的进程,默认使用当前程序主进程:
<service
android:name="org.foreal.MusicServiceTest"
android:enabled="true"
android:process=":music_process"
></service>
其中如果进程的名字时以 ":"开头的,说明进程是当前程序的私有进程,其他程序无法访问,如果是以小写字母开头的进程,说明进程是一个全局的进程,多个程序都可访问此进程,达到多程序共享进程的目的。
3.如果不用新进程的Service,如何方便的进行一些阻塞操作?
可以继承IntentService来编写自己的Service,IntentService会自动创建一个worker thread,来进行操作如:
public class MyIntentService extends IntentService {
private final static String TAG = "MyIntentService";
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i(TAG, "onHandleIntent");
try {
synchronized (this){
wait(3000);
}
Log.i(TAG, "完成一次");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
其中只需要重写onHandleIntent方法来处理自己的操作就行,其中每一次的操作都会进去队列中,按顺序串行执行。
其中要注意的是,IntentService在执行完队列中所有操作以后会自动销毁当前Service,也就是说,如果你onHandleIntent中是个非阻塞操作的话,很可能每次调用结束以后Service都被销毁,然后下次在建立新的Service。
此类可以很方便的完成大多数工作,但是如果要进行并发操作的Service,此类就不适合,应自己实现。
3. 如何使Service私有?
如果在Service中声明intent filter,那么其他程序也可以通过你声明的intent filter来访问你的Service,为了避免这种情况,首先你可以去掉intent filter,每次调用Service都使用Intent(Context, Class)的形式,但是,如果喜欢用intent filter的形式,可以使用exported标签,来使Service私有,这样即使定义intent filter,其他程序也无法访问。
4.如果一个Service在startService以后 又进行了bindService那么他的生命周期是怎样的,stopService能否结束掉Service?
答案是不能的,如果一个Service进行了bind操作,那么再进行stopService是无法结束掉此Service,知道绑定的Context全部结束,或解除绑定,Service才会被结束。
5. Service 中Onstart方法中,参数startid是什么意思,又有什么用处?
因为在使用startService开启一个Service以后,必须手动的关闭Service,所以Service可能自己调用 stopSelf 方法,来在任务完成的时候结束掉自己。
但是这个时候就会出现一个问题,如果startService调用了2次,那么就执行了两次onStart操作,在第一次onStart操作结束以后,Service可能会认为任务已经完成,并结束掉自己,这个时候第二次的onStart可能还没结束,导致了任务还未完成就被强行关闭了。
而startid代表当前onStart被调用的一个编号,在结束Service时候,调用stopSelf(startid),这样Service就可以检查,此startid是否是最近一次调用的,如果是,那么才结束Service,否则不结束。
如有错误,欢迎指出探讨。
分享到:
相关推荐
在Android开发过程中,许多开发者可能会陷入一些常见的误区,这些误区可能导致效率降低、代码质量下降或者应用性能不佳。本文将深入探讨13个Android开发中的常见误区,并提供相应的解决策略,帮助开发者提升技能,...
Android开发是移动应用领域的一个重要分支,尤其对于初学者来说,避免一些常见的误区至关重要。本文将详细解析标题和描述中提到的10个Android新手误区,帮助开发者更好地理解和提升开发技能。 1. **不读Android开发...
【C/C++常见误区详解】 在C/C++编程中,遵循标准和良好的编程习惯至关重要,因为这直接影响到代码的可读性、移植性和维护性。以下是一些常见的误区及其解释: 1. **头文件包含误区**:在C/C++中,通常推荐使用`<>`...
多媒体CAI课件制作中的几个误区探析多媒体CAI课件制作中的几个误区探析
本篇文章主要探讨了自定义LayoutManager过程中的一些常见误区、问题和注意事项,同时介绍了相关API的使用。 首先,自定义LayoutManager并非易事,需要对Android系统视图布局机制有深入理解。一些初学者可能误以为仅...
中国品牌出海的10个常见误区.f
团队建设的五个阶段与常见误区 团队建设是企业或组织中的一个核心部分,对企业的发展和成长产生着至关重要的影响。然而,许多企业在团队建设中都会遇到一些常见的误区,本文将对团队建设的五个阶段和常见误区进行...
今天我们来看看电子工程师会出现的下面的几个误区,你是不是也这样想的。 误区一:这板子的PCB 设计要求不高,就用细一点的线,自动布吧。点评:自动布线必然要占用更大的PCB 面积,同时产生比手动布线多好多倍的过...
民营企业管理常见误区.doc
本文主要介绍在LED显示屏采购过程中的常见误区。
以下是一些常见的性能测试误区及其详细解析: 1. 误区一:提高硬件配置就能解决性能问题,性能测试不重要。这种观点源于早期软件规模较小的时代,那时硬件升级往往能有效提升性能。如今,随着软件复杂度增加,硬件...
本压缩包文件“行测逻辑判断常见误区.zip”提供了一份详细文档“行测逻辑判断常见误区.docx”,旨在帮助考生识别并避免在解答此类题目时易犯的错误,提高答题准确率。以下是对这些常见误区的详细解析: 1. **过度...
在实际设计过程中,由于缺乏深入的理解和技术经验,设计者可能会陷入一些常见的误区。本文将详细介绍几个关于差分信号PCB布局布线时的常见误区,并提供相应的解决方案。 误区一:错误理解差分信号的回流路径 一个...
10个常见的_Android_新手误区.doc 12586020.rar 5 Android源码.rar android 2高级编程(第2版).zip Android_控件.doc android中文教程.rar Android基础教程.rar android学习进阶路.doc android平台初级错误...
医院HPV疫苗应用常见误区.docx
走出当前保健中的常见误区
企业经营管理常见误区的讲座.doc
绩效管理常见误区及工具使用.doc
医疗器械临床评价常见误区浅析.pdf
这里有10个最常见的误区。 1,阅读Android文档 Android开发者网站是你获得帮助的最重要地方。大部分的文档既可以随着SDK下载,也可在网上直接查阅(我们推荐在线浏览,因为它是不断更新的)。这些文档是不仅仅是...