Android系统组件Service详解
service工作原理
service工作原理service是Android平台上的一种组件,用于在后台执行长时间运行的操作或处理来自其他组件的请求。
它可以在应用程序的主线程之外运行,因此不会阻塞用户界面(UI)的操作。
Service运行在相对独立的进程中,因此即使在应用程序被销毁或不可见时,它仍然可以继续运行。
Service可以分为两种类型:启动式和绑定式。
启动式服务通过startService()方法来启动,不与调用者之间建立直接的链接。
它们在后台独立运行,无需依附于调用者的生命周期。
绑定式服务则通过bindService()方法绑定到调用者,与调用者之间建立一对一的链接。
这种服务的生命周期与调用者的生命周期相关联。
Service的工作原理如下:1. 在应用程序中创建一个继承自Service基类的子类,并重写其onCreate()、onStartCommand()和onDestroy()方法(对于绑定式服务,还需重写onBind()和onUnbind())。
2. 在应用程序的清单文件中声明该Service组件,以便系统可以识别并启动它。
可以通过设置属性android:exported为true或false来指定Service是否可以被其他应用程序访问。
3. 在需要启动或绑定Service的地方,调用startService()或bindService()方法。
通过Intent可以传递操作和数据给Service。
4. 如果是启动式服务,调用者与Service之间没有直接的链接,Service会在后台独立运行。
它会在调用startService()方法后立即调用onStartCommand()方法,在这个方法里可以执行耗时的操作。
5. 如果是绑定式服务,调用者与Service建立起一对一的链接。
调用bindService()方法后,会触发Service的onBind()方法,在这个方法里可以返回一个提供给调用者进行交互的Binder对象。
Service
Binder系统
Binder情景分析 可以将一个IPC通讯理解成客户端/服务器模式,一 个典型的Binder应用模式如下: 1.客户端通过某种方式得到服务器端的代理对象 ,从客户端看代理对象和他的本地对象没有什么分别,一 样可以调用方法,访问变量。 2.客户端通过调用服务器代理对象的方法向服务 器端发送请求。 3.代理对象将用户请求通过Android内核的Binder 驱动发送到服务器进程。 4.服务器进程处理用户请求,并通过Binder驱动 返回处理结果给客户端的代理对象。 5.客户端收到代理对象返回的处理结果。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完 onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 onStart 方法的创建的service一开始是onCreate 然后调用onStartCommand() (在老的版 本中是onStart()函数,新版本中调用onStartCommand的话还是会去调用onStart方 法,建议使用onStartCommand方式)。如果该service不stop的话,再点的话一直会是 onstart相应,onCreate只有在第一次启动的时候会调用。
绑定一个已经存在的Service
//连接对象
private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder ibinder) {Log.i(“Service”,“连接成功!”);} public void onServiceDisconnected(ComponentName name) {Log.i(“Service”,“断开连接!”);} }; //绑定Service bindService(intent,conn,Service.BIND_AUTO_CREATE);
Android 应用程序的基本组件
Android 应用程序的基本组件Android 操作系统是目前世界上最流行的移动操作系统之一。
它提供了广泛的应用程序开发工具和框架,使开发者能够轻松地创建出丰富多样的应用程序。
而这些应用程序的基础是由一些基本组件构成的。
本文将介绍 Android 应用程序的基本组件,包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。
活动(Activity)是 Android 应用程序的核心组件之一。
它代表了用户与应用程序之间的交互界面。
每个 Android 应用程序都至少包含一个活动,而活动可以包含多个界面元素,例如按钮、文本框、图像等。
活动通过布局文件定义了界面的外观和布局,通过代码来处理用户的操作和响应。
活动之间可以通过意图(Intent)来进行切换和通信,从而实现应用程序之间的流转和交互。
服务(Service)是在后台运行的组件,它可以在没有用户界面的情况下执行长时间运行的操作。
服务通常用于执行一些独立的任务,例如播放音乐、下载文件等。
通过在应用程序中创建服务,开发者可以在用户不可见的情况下执行一些必要的操作,并提供持久性的后台功能。
广播接收器(Broadcast Receiver)是一种用于接收系统广播消息的组件。
广播是 Android 系统中不同组件之间进行通信的一种方式,例如设备启动完成、电池电量变化等。
通过注册一个广播接收器,开发者可以监听和响应系统广播消息,并执行相应的操作。
广播接收器可以用于实现各种功能,例如接收短信、接收网络状态变化等。
内容提供器(Content Provider)是 Android 中用于共享数据的一种机制。
内容提供器允许一个应用程序将其数据暴露给其他应用程序。
通过内容提供器,不同的应用程序可以相互访问和共享数据,实现数据的交互和共用。
例如,系统提供的联系人数据库就是通过内容提供器来共享和访问联系人数据的。
Service详解
Service详解⼀什么是Service⼀个Service是没有界⾯且能长时间运⾏于后台的应⽤组件.其它应⽤的组件可以启动⼀个服务运⾏于后台,即使⽤户切换到另⼀个应⽤也会继续运⾏.另外,⼀个组件可以绑定到⼀个service来进⾏交互,即使这个交互是进程间通讯也没问题.例如,⼀个aservice可能处理⽹络事物,播放⾳乐,执⾏⽂件I/O,或与⼀个内容提供者交互,所有这些都在后台进⾏.⼀个service本质上可有两种表现形式: 尽管这个⽂档是把这两种service分开讲的,但你的service可以在这两种⽅式下⼯作.—它可以是started(⽆限期运⾏)同时也允许绑定.唯⼀的简单问题是你是否实现了⼀对回调⽅法:onStartCommand()允许组件启动它并且onBind()允许绑定.不论你是应⽤是否启动,或绑定到⼀个服务或两者都做了,任何应⽤组件都可以使⽤service(即使从另⼀个应⽤),跟任何组件都可以使⽤activity⼀样—通过⼀个Intent启动它.然⽽,你可以在manifest⽂件中声明服务为私有,并且阻⽌另外的应⽤访问它.这在讲如何于manifest⽂件中声明service时会详细讲解. 注意:⼀个service是运⾏在它所在进程的主线程中的—service不会创建它⾃⼰的thread也不会运⾏于单独的进程(除⾮你另外指定).这表⽰,如果你的service想做⼀些狂耗CPU的⼯作或阻塞型的操作(⽐如MP3播放或⽹络通讯),你必须在service中创建⼀个新的线程来做那些⼯作.通过使⽤⼀个分离的线程,你将减少"应⽤没有反应"(ANR)错误并且应⽤的主线程可以保持activity对⽤户操作的快速反应.基础你应使⽤⼀个service还是线程? ⼀个service是⼀个在⽤户不与你的应⽤交互时依然可以运⾏于后台的简单组件.所以,只有你需要这样做时才创建⼀个service. 如果你需要执⾏的⼯作不在主线程中,但是只有⽤户在与你的应⽤交互时才进⾏,那么你可能应该创建⼀个新的线程⽽不是⼀个service.例如,如果你想播放⼀些⾳乐,但是只在你的activity运⾏时才播放,你应该在onCreate()中创建⼀个线程,在onStart()运⾏这个线程,然后在onStop()中停⽌它.也可以考虑使⽤AsyncTask或HandlerThread,来代替传统的线程类. 记住,如果你使⽤了service,它默认会固定运⾏于你的应⽤的主线程,所以你应该在其中创建⼀个线程来执⾏耗时或阻塞的操作要创建⼀个service,你必须创建⼀个Service类(或某个已存在的⼦类)的⼦类.在你的实现中,你应覆写⼀些处理有关service⽣命期的关键⽅⾯的回调⽅法并且提供⼀个能让组件绑定到service的机制(如果需要).你应覆写的最重要的回调⽅法是: 如果⼀个组件通过调⽤startService()启动⼀个service(最终导致onStartCommand()被调⽤),之后service会保持运⾏,直到它通过stopSelf()停⽌⾃⼰或另外的组件调⽤stopService()停⽌它. 如果⼀个组件调⽤bindService()来创建service(onStartCommand()不会被调⽤),那么service只是运⾏在绑定期间.⼀旦service从所有的客户端解除绑定,系统就会杀了它. Android系统只在内存很少并且必须为具有⽤户焦点的actvity釋放资源时才会强制停⽌⼀个service.如果service是绑定到具有⽤户焦点的activity上,那么它很难被杀死,并且如果service被声明为运⾏于前台(后⾯将讨论),那么它将永不被杀死,除⾮,如果这个service启动并且长期运⾏,那么系统将会降低它在后台任务超时列表中的位置然后这个将变成⾼度易被杀对象—如果你的service被启动,那么它必须被设计为能优雅地处理被系统重启的操作.如果系统杀死了你的service,它会在资源重新可⽤时⽴马重启它(但是依赖于你在onStartCommand()中的返回值).⼆如何创建⼀个Service在manifest中声明⼀个service 跟activity以及其它组件⼀样,你必须在你的应⽤的manifest⽂件中声明所有的service们. 要声明你的service,添加⼀个<service>元素作为<application>元素的⼉⼦.例如:[java]01. <manifest ... >02. ...03. <application ... >04. <service android:name=".ExampleService" />05. ...06. </application>07. </manifest> 有许多属性你可以包含在<service>元素中,⽐如启动service的权限和service运⾏所在的进程.android:name属性是哇⼀必须的—它指定了service类的名字.⼀旦你发布了你的应⽤,你不应再改变这个名字,因为如果你改了,你可能使⼀些通过明确的intent来引⽤你的service的功能⽆法运⾏. 就像⼀个activity,⼀个service可以定义intent过滤器来使得其它组件使⽤明确的intent调⽤⾃⼰.通过声明intent过滤器,你设备上的任意应⽤中的组件都可以通过给startService()传递匹配的intent来启动你的sevice. 如果你打算只在本应⽤内使⽤⾃⼰的service,那么你不需指定任何intent过滤器.不使⽤intent过滤器,你必须使⽤⼀个明确指定service的类名的intent来启动你的service. 另外,你也可以通过包含android:exported属性,并指定其值为”false”来保证你的service是私有的.即使你的service使⽤了intent过滤器,也会起作⽤.创建⼀个"启动的"Service 针对Android1.6或更早的版本: 如果你创建的应⽤是针对Android1.6或更早版本的,你需要实现onStart()⽽不是onStartCommand()(在Android2.0中,onStart()被废弃代替之以onStartCommand()). 更多关于如何兼容2.0之前版本的知识,请看onStartCommand()⽂档. ⼀个启动的service,在被其它组件调⽤startService()来启动时,会导致service的onStartCommand()⽅法被调⽤. 当⼀个service被启动后,它的⽣命期就不再依赖于启动它的组件并且可以独⽴运⾏于后台,即使启动它的组件死翘翘了.所以,service应该⼯作完成后调⽤stopSelf()⾃⼰停⽌掉,或者其它组件也可以调⽤stopService()停⽌service. ⼀个应⽤组件,⽐如⼀个activity可以通过调⽤startService()启动service同时传递⼀个指定service和service所⽤的数据的Intent,service在⽅法onStartCommand()中接收这个Intent.事物完成后,service停⽌⾃⼰然后被销毁. ⼩⼼:service默认运⾏在声明它的应⽤进程的主线程中.所以,如果你的service执⾏密集运算或阻塞操作并且与跟⽤户交互的activity位于相同的应⽤中,这个service将会拉低activity的性能.要避免影响应⽤的性能,你必须在service中启动⼀个线程. 传统上,有两个类你可以从它派⽣来创建"启动的"service:从IntentService类派⽣ 因为⼤多数"启动的"service不需要同时处理多个请求,可能从IntentService实现你的service是最好的选择.IntentService做了以下⼯作: 以上实现使得你可以仅仅实现onHandleIntent()来做要做的⼯作即可.(当然,你还是要实现⼀个⼩⼩的构造函数).下⾯是⼀个实现IntentService的例⼦:01. public class HelloIntentService extends IntentService {02.03. /**04. * ⼀个构造函数是必须的,并且你必须调⽤⽗类的IntentService(String)以传⼊⼯作线程的名字.05. */06. public HelloIntentService() {07. super("HelloIntentService");08. }09.10. /**11. * IntentService在默认的⼯作线程中调⽤这个⽅法<p> *当这个⽅法返回后,IntentService停⽌服务,如果能停⽌的话.12. */13. @Override14. protected void onHandleIntent(Intent intent) {15. // Normally we would do some work here, like download a file.16. // For our sample, we just sleep for 5 seconds.17. long endTime = System.currentTimeMillis() + 5*1000;18. while (System.currentTimeMillis() < endTime) {19. synchronized (this) {20. try {21. wait(endTime - System.currentTimeMillis());22. } catch (Exception e) {23. }24. }25. }26. }27. }</p> 以上就是你所有需要做的:⼀个构造函数和⼀个onHandleIntent()的实现. 如果你决定重写其它的⽅法,⽐如onCreate(),onStartCommand(),oronDestroy(),要保证调⽤⽗类的对应实现,这样IntentService才能正确地处理⼯作线程的⽣命期.⽐如,onStartCommand()必须返回默认的实现(其中实现了intent被传送到onHandleIntent()的逻辑):[java]01. @Override02. public int onStartCommand(Intent intent, int flags, int startId) {03. Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();04. return super.onStartCommand(intent,flags,startId);05. } 除onHandleIntent()外,唯⼀不需调⽤⽗类实现的⽅法是onBind()(但是你只需在你的service允许绑定时才实现它). 在下⼀节,你将看到同样的service类,从类Service派⽣时是如何实现的.这需要写更多的代码,但是当你需要处理同时发⽣的请求时(⾮序列化)这就是合适的做法了使⽤类IntentService使得你实现⼀个"开始的"service⾮常容易.然⽽,如果你需要你的service以多线程⽅式执⾏(⽽不是使⽤⼯作队列),那么你需要从类Service派⽣来处理每个intent. 相⽐之下,下⾯的例⼦从类Service派⽣并实现了与上⾯使⽤IntentService例⼦完全相同的⼯作.也就是在⼀个线程中序列化的处理每个"开始"请求.01. <span style="font-size:18px;">public class HelloService extends Service {02. private Looper mServiceLooper;03. private ServiceHandler mServiceHandler;04.05. // 处理从线程收到的消息们06. private final class ServiceHandler extends Handler {07. public ServiceHandler(Looper looper) {08. super(looper);09. }10. @Override11. public void handleMessage(Message msg) {12. // 通常我们在这⾥做⼀些⼯作⽐如下载⼀个⽂件13. // 在我们的例⼦中,仅仅是睡5秒钟.14. long endTime = System.currentTimeMillis() + 5*1000;15. while (System.currentTimeMillis() < endTime) {16. synchronized (this) {17. try {18. wait(endTime - System.currentTimeMillis());19. } catch (Exception e) {20. }21. }22. }23. // 使⽤startId停⽌服务,从⽽使我们不会在处理24. // 另⼀个⼯作的中间停⽌service25. stopSelf(msg.arg1);26. }27. }28.29. @Override30. public void onCreate() {31. // 启动运⾏service的线程.注意我创建了⼀个32. // 分离的线程,因为service通常都是在进程的33. // 主线程中运⾏,但我们不想让主线程阻塞.我们还把新线程34. // 搞成后台级的优先级,从⽽减少对UI线程(主线程的影响).35. HandlerThread thread = new HandlerThread("ServiceStartArguments",36. Process.THREAD_PRIORITY_BACKGROUND);37. thread.start();38.39. // Get the HandlerThread's Looper and use it for our Handler40. mServiceLooper = thread.getLooper();41. mServiceHandler = new ServiceHandler(mServiceLooper);42. }43.44. @Override45. public int onStartCommand(Intent intent, int flags, int startId) {46. Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();47.48. // 对于每个开始请求,发送⼀消息来开始⼀次⼯作,并且把49. // start ID也传过去,所以当完成⼀个⼯作时,我们才知道要停⽌哪个请求.50. Message msg = mServiceHandler.obtainMessage();51. msg.arg1 = startId;52. mServiceHandler.sendMessage(msg);53.54. // 如果我们在这⾥返回后被被杀死了,重启之.55. return START_STICKY;56. }57.58. @Override59. public IBinder onBind(Intent intent) {60. // We don't provide binding, so return null61. return null;62. }63.64. @Override65. public void onDestroy() {66. Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();67. }68. }69. </span> 如你所见,要做的⼯作⽐使⽤IntentService时多⼀些. 然⽽,因为你⾃⼰处理每次对onStartCommand()的调⽤,你可以同时执⾏多个请求.这个例⼦并没有那样做,但是如果那是你所需要的,那么你可以为每个请求创建⼀个新的线程并且⽴即运⾏它们(⽽不是等待上⼀个请求完成). 注意⽅法onStartCommand()必须返回⼀个整数.这个整数描述了在系统杀死它的事件中系统如何继续这个服务(如前⾯所述,IntentService的默认实现为你处理这些,当然你也能够去改写它).onStartCommand()也返回值必须是下⾯常量之⼀:开始⼀个Service 你可以从⼀个activity或从其它应⽤的组件通过传递⼀个Intent(指定了要启动的服务)给startService()启动⼀个服务.Android系统然后调⽤service的onStartCommand()⽅法并且把Intent传递给它.(你永远不能直接调⽤onStartCommand().) 例如,⼀个activity可以在调⽤startService()时使⽤⼀个明确的intent开始前⽂的例⼦中的service(HelloSevice):Intentintent = new Intent(this, HelloService.class);startService(intent); startService()⽅法会⽴即返回然后Android系统调⽤service的onStartCommand()⽅法.但是如果service尚没有运⾏,系统会先调⽤onCreate(),然后调⽤onStartCommand(). 如果service没有提供绑定功能,传给startService()的intent是应⽤组件与service之间唯⼀的通讯⽅式.然⽽,如果你希望service回发⼀个结果,那么启动这个service的客户端可以创建⼀个⽤于⼴播(使⽤getBroadcast())的PendingIntent然后放在intent中传给service,service然后就可以使⽤⼴播来回送结果. 不同的启动请求导致对service的onStartCommand()的不同调⽤,但停⽌service的请求只有⼀个(使⽤stopSelf()或stopService()).停⽌⼀个service ⼀个"启动的"service必须管理其⾃⼰的⽣命期.这表⽰,系统不会停⽌或销毁这种service,除⾮内存不够⽤了并且service在onStartCommand()返回后会继续运⾏.所以,service必须调⽤stopSelf()停⽌⾃⼰或由另⼀个组件调⽤stopService()来停⽌它. ⼀旦通过stopSelf()或stopService()发出了停⽌请求,系统就会尽可能快地销毁service. 然⽽,如果你的service同时处理多个对onStartCommand()的请求,那么你不应在处理完⼀个请求之后就停⽌service,因为你可能已经⼜收到了新的启动请求(在第个完成后停⽌将会结束掉第⼆个).要避免这个问题,你可以使⽤stopSelf(int)来保证你的停⽌请求对应于你最近的开始请求.也就是,当你调⽤stopSelf(int)时,你传递开始请求的ID(传递给onStartCommand()的startId)给service,如果service在你调⽤stopSelf(int)之前收到⼀了个新的开始请求,发现ID不同,于是service将不会停⽌. 注意:你的应⽤在完成⼯作后停⽌它所有的service是⾮常重要的.这可以避免浪费系统资源和消耗电量.如果需要,其它的组件可以调⽤stopService()停⽌service.即使你为service启⽤了绑定,你也必须⾃⼰停⽌service,甚⾄它收到了对onStartCommand()的调⽤也这样.创建⼀个绑定的Service ⼀个绑定的service是允许应⽤的组件通过调⽤bindService()来绑定它以创建⼀个能长期存在的连接(并且⼀般不允许组件调⽤startService()来启动它). 当你的activity或其它组件想与service交互或你的应⽤想基于IPC的向其它应⽤提供功能时,你应该创建⼀个绑定的service. 要创建⼀个绑定的service,你必须实现回调⽅法onBind(),还要在其中返回⼀个IBinder,这个IBinder定义了与service通讯的接⼝.其它应⽤组件就可以在之后调⽤bindService()来接收这个接⼝并开始调⽤service的⽅法.service只在有应⽤组件绑定到它时才活着,所以当没有组件绑定到它时,系统就会宰了它(你不需去停⽌⼀个绑定的service,跟⽤onStartCommand()启动的service不⼀样). 要创建⼀个绑定的service,⾸先要做的就是定义客户端如何与service通讯的接⼝.这个接⼝必须是IBinder的⼀个实现,并且必须被回调⽅法onBind()返回.⼀旦客户端接收到IBinder,它就可以开始与service进⾏交互. 多个客户端可以⼀起绑定到⼀个service.当⼀个客户端完成与service的交互,它调⽤unbindService()来解除绑定.⼀旦不再有任何客户端绑定到service,系统就宰了这个service. 有很多⽅法来实现⼀个绑定的service并且这些实现要⽐"开始的"service难懂得多.发送通知给⽤户 ⼀旦开始运⾏,⼀个service可以通过Toast通知或状态栏通来通知⽤户⼀些事件. ⼀个toast通知是⼀个出现在当前窗⼝表⾯上并过⼀会就消失的消息.当⼀个状态栏通知提供⼀个带有消息的图标到状态栏,⽤就可以先定它来执⾏⼀些动作(⽐如启动⼀个activity). 通常,⼀个状态栏通知是当⼀些后台⼯作(⽐如⼀个⽂件下载完成了)完成后通知⽤户可以对它进⾏动作的最佳⽅式.当⽤户选择这个通知时,它可以开始⼀个activity(⽐如可以查看下载的⽂件).在前台运⾏Service ⼀个前台的service是被⽤户强烈关注的从⽽不会在内存低时被系统杀死.前台service必须在状态栏上提供⼀个通知,这个通知被放在"正在进⾏"区域中,这表⽰这个通知不能被解除,除⾮服务停⽌了或者从前台移除了. 例如,⼀个从service播放⾳乐的⾳乐播放器,应被设置为前台运⾏,因为⽤户会明确地注意它的运⾏.在状态栏中的通知可能会显⽰当前的歌曲并且允许⽤户启动⼀个activity来与⾳乐播放器交互.[java]01. Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),02. System.currentTimeMillis());03. Intent notificationIntent = new Intent(this, ExampleActivity.class);04. PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);05. notification.setLatestEventInfo(this, getText(R.string.notification_title),06. getText(R.string.notification_message), pendingIntent);07. startForeground(ONGOING_NOTIFICATION, notification); 要请求你的service运⾏于前台,调⽤startForeground().此⽅法有两个参数:⼀个整数唯⼀的标识⼀个通知,和这个⽤于状态栏的通知,例如: 要从前台移除service,调⽤stopForeground().这个⽅法有boolean型参数,表明是否也从状态栏删除对应的通知.这个⽅法不会停掉service.然⽽,如果你停⽌了正在前台运⾏的service,这个通知也会被删除. 注意:⽅法startForeground()和⽅法stopForeground()是从Android2.0 (API Level 5)引⼊的.为了在早期版本是于前台运⾏你的service,你必须使⽤以前的那个setForeground()⽅法—见startForeground()的API⽂档查看如何提供与旧版本的兼容性.管理Service的⽣命期 ⼀个service的⽣命期⽐⼀个activity要简单得多.然⽽,你依然需要密切关注你的service是如何被创建⼜是如何被销毁的,因为⼀个service可以运⾏于后台⽽⽤户看不到它. service的⽣命期—从它被创建到它被销毁—有两条路可⾛: 这两条路并不是完全分离的.也就是,你是可以绑定到⽤startService()启动的service的.例如,⼀个后台⾳乐service在通过传⼊指明要播放的⾳乐的intent来调⽤startService()后启动.之后,当⽤户想对播放器进⾏⼀些操作或要获取当前歌曲的信息时,⼀个activity可以通过调⽤bindService()绑定到service.在此情况下,stopService()或stopSelf()不会真正的停⽌service,除⾮所有的客户端都取消绑定了.实现⽣命期回调⽅法 就像activity,service也具有⽣命期回调⽅法,⽤它们你可以监视service的状态的变化并且在合适的时机做⼀些⼯作.下⾯的框架代码演⽰了每个⽣命期⽅法的实现:[java]01. public class ExampleService extends Service {02. int mStartMode; // 表明在service被杀后的⾏为03. IBinder mBinder; // 客户端绑定到的接⼝04. boolean mAllowRebind; // 表明onRebind是否应被使⽤05.06. @Override07. public void onCreate() {08. // The service is being created09. }10. @Override11. public int onStartCommand(Intent intent, int flags, int startId) {12. // service 正在启动,在调⽤startService()期间被调⽤13. return mStartMode;14. }15. @Override16. public IBinder onBind(Intent intent) {17. // ⼀个客户端通过bindService()绑定到这个service18. return mBinder;19. }20. @Override21. public boolean onUnbind(Intent intent) {22. // 所有的客户端使⽤unbindService()解除了绑定23. return mAllowRebind;24. }25. @Override26. public void onRebind(Intent intent) {27. // ⼀个客户端在调⽤onUnbind()之后,正使⽤bindService()绑定到service28. }29. @Override30. public void onDestroy() {31. // service不再被使⽤并将被销毁32. }33. }注:不像activity的⽣命期回调⽅法们,你不需要调⽤⽗类的相应实现.图 2.service的⽣命期.左图显⽰了⽤startService()创建的service的⽣命期,右图显⽰了⽤bindService()创建的service的⽣命期.通过实现这些⽅法们,你可以监视service⽣命期的两个嵌套循环:注:尽管⼀个"启动的"service在调⽤stopSelf()或stopService()时结束,但并没有单独的回调对应这些停⽌⽅法(没有类似于onStop()的回调).所以,除⾮service被绑定到⼀个客户端,系统就会在停⽌时销毁service—onDestroy()是唯⼀收到的回调.图 2演⽰了service的典型回调.尽管图⽰分开了通过startService()和bindService()创建的service,但记住任何service,不管它是怎样启动的,都是可能允许绑定的.所以⼀个从onStartCommand()启动的service(客户端调⽤了startService())仍可以接收onBind()调⽤(当客户端调⽤bindService()时).。
android四大组件知识点
android四大组件知识点Android开发中,四大组件是Android系统的核心特性之一。
每个组件都有它自己的功能,但是它们都能够相互配合,实现丰富多彩的应用程序。
在本文中,我们将会介绍Android四大组件的知识点。
1. ActivityActivity是Android中最常用的一个组件,它是用户界面的窗口,负责与用户进行交互。
一个应用程序通常由多个Activity组成,每个Activity都是一个独立的界面。
2. ServiceService是一个后台运行的组件,可以在没有用户界面的情况下执行一些任务,例如播放音乐、下载文件等。
Service还可以与Activity进行通信,通过Intent来传递数据。
3. BroadcastReceiverBroadcastReceiver是一种接收广播消息的组件,它可以接收来自系统或其他应用程序的广播消息,并且可以执行一些操作,例如更新UI界面、发送通知等。
BroadcastReceiver还可以向其他应用程序发送广播消息,实现应用程序间的通信。
4. ContentProviderContentProvider是一个数据访问的组件,可以访问应用程序的数据,并且可以与其他应用程序共享数据。
ContentProvider通常用于存储应用程序的数据,例如联系人、短信、日历等。
在Android开发中,四大组件都有其独特的用途,但是它们也可以相互配合,实现更强大的功能。
例如,Activity可以启动Service,在Service中执行一些任务,然后将结果返回给Activity;BroadcastReceiver可以接收来自Service的广播消息,更新UI界面等。
因此,熟悉四大组件的知识点对于开发高质量的Android应用程序非常重要。
android systemservice类理解
android systemservice类理解Android SystemServer类是Android系统中的一个重要组件,负责管理系统中的各种服务和功能模块。
了解SystemServer类的工作原理和功能对于理解Android系统的整体架构非常重要。
本文将深入探讨Android SystemServer类的相关知识,帮助读者更好地理解和掌握Android系统的工作原理。
SystemServer类是Android系统启动过程中的一个关键角色,它在系统启动时被创建并负责启动和管理系统中的各种服务。
SystemServer类的主要作用包括但不限于以下几个方面:1. 启动系统服务:SystemServer类负责启动系统中的各种服务,包括ActivityManagerService、PowerManagerService、PackageManagerService等。
这些系统服务是Android系统正常运行的基础,SystemServer类通过启动这些服务确保系统的正常运行。
2. 管理系统功能模块:SystemServer类还负责管理系统中的各种功能模块,包括输入管理、窗口管理、通信管理等。
它通过调用相应的模块来管理系统的各项功能,确保系统的稳定运行。
3. 处理系统启动流程:SystemServer类在系统启动时被创建并启动,它会依次启动系统中的各个服务和功能模块,完成系统的初始化和准备工作。
系统启动的过程中,SystemServer类扮演着重要的角色。
了解SystemServer类的工作原理和功能有助于我们更好地理解Android系统的整体架构。
在Android系统的启动过程中,SystemServer类起着至关重要的作用,它负责启动系统中的各种服务和功能模块,确保系统的正常运行。
SystemServer类的工作原理可以总结为以下几个步骤:1. 创建SystemServer实例:系统启动时,SystemServer类的实例会被创建并初始化。
android hwc service的处理流程
android hwc service的处理流程Android HWC Service的处理流程概述Android HWC(Hardware Composer)Service是Android系统中负责处理图形合成和显示的重要组件之一。
它负责接收来自应用程序和系统服务的请求,将图形元素合成为最终的图像帧,并通过硬件接口将图像显示到屏幕上。
本文将详细说明Android HWC Service的处理流程。
流程一:接收请求在Android系统中,应用程序和系统服务通过SurfaceFlinger将图形请求发送给HWC Service。
HWC Service会按照请求的先后顺序接收并处理这些请求。
流程二:合成图像HWC Service将接收到的多个图形请求进行合成,生成最终的图像帧。
图像合成过程包括以下几个步骤: - 图层排序:根据每个图层的显示顺序和属性,对所有图层进行排序,确定它们在最终图像中的叠放次序。
- 图层合成:将排序后的图层依次合成到一个缓冲区中。
在合成过程中,HWC Service可能会使用硬件加速功能,例如GPU加速,以提高合成效率。
- 混合模式:根据每个图层的设置,将它们合成到最终图像中,并应用相应的混合模式,例如正常混合、透明混合等。
流程三:交给显示引擎合成完成后,HWC Service将最终的图像帧交给显示引擎,通过硬件接口将图像显示到屏幕上。
流程四:VSync同步为了保证图像显示的流畅性,Android系统采用了VSync(垂直同步)机制。
HWC Service会监听VSync信号,并在信号到来时将当前的图像帧发送到显示引擎,以进行显示。
这样,图像的更新频率将与显示设备的刷新率保持同步,避免出现画面撕裂等问题。
结论通过以上的流程,Android HWC Service可以高效地处理图形合成和显示任务,确保应用程序和系统界面在屏幕上的流畅显示。
了解HWC Service的处理流程对于开发者来说是非常重要的,可以帮助他们优化图形渲染和图层合成的性能,提升用户体验。
service
Service一、 Service简介Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。
service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。
二、创建、配置service1、定义一个继承service的类,并实现相应的接口。
2、AndroidManifest.xml中配置该service。
三、Service启动、停止Service的启动有两种方式:context.startService() 和context.bindService()Serviced的停止方式:其他组件:context.stopService(),自己:Service.stopSelf()方法或者Service.stopSelfResult()1、context.startService() 启动流程:context.startService() -> onCreate() -> onStart() -> Servicerunning -> context.stopService() -> onDestroy() -> Service stop如果Service还没有运行,则android先调用onCreate(),然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
如果stopService的时候会直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行,该Service的调用者再启动起来后可以通过stopService关闭Service。
Android开发四大组件概述
Android开发四⼤组件概述这个⽂章主要是讲Android开发的四⼤组件,本⽂主要分为⼀、Activity具体解释⼆、Service具体解释三、Broadcast Receiver具体解释四、Content Provider具体解释外加⼀个重要组件 intent的具体解释。
(主要来⾃于⽹络)1、Activity⼀个Activity通常展现为⼀个可视化的⽤户界⾯。
⽐如,⼀个activity可能展现为⼀个⽤户能够选择的菜单项列表或者展现⼀些图⽚以及图⽚的标题。
⼀个消息服务应⽤程序可能包括⼀个显⽰联系⼈列表的activity,⼀个编写信息的activity,以及其他⼀些查看信息和改动应⽤程序设置的activity。
尽管这些activity⼀起⼯作,共同组成了⼀个应⽤程序,但每个activity都是相对独⽴的。
每个activity都是Activity(android.app.Activity)的⼦类。
⼀个应⽤程序可能仅仅包括⼀个activity,或者像上⾯提到的消息服务程序⼀样有多个activity。
⼀个应⽤程序包括⼏个activity以及各个activity完毕什么样的功能全然取决于应⽤程序以及它的设计。
通常每⼀个应⽤程序都包括⼀个在应⽤程序启动后第⼀个展现给⽤户的 activity。
在当前展现给⽤户的activity中启动⼀个新的activity,能够实现从⼀个activity转换到另外⼀个 activity。
每⼀个activity都会有⼀个⽤于绘制⽤户界⾯的窗体。
通常这样⼀个窗体会填充整个屏幕,当然这个窗体也能够⽐屏幕⼩并漂浮在其它窗体之上。
activity还能够使⽤⼀些额外的窗体,⽐如⼀个要求⽤户响应的弹出式对话框,或者是当⽤户在屏幕上选择⼀个条⽬后向⽤户展现⼀些重要信息的窗体。
展⽰activity窗体的可视化内容区域是⼀些具有层次关系(⾮常像数据结构中的树)的视图,⽽视图则是由类View的⼦类表⽰的。
android systemservice类理解
android systemservice类理解在Android中,`SystemService`(系统服务)是一种提供系统级功能的组件。
它允许应用程序与系统的核心功能进行交互,而无需了解底层实现细节。
系统服务是一种将设备功能暴露给应用程序的机制,使应用程序能够访问设备硬件、系统资源和其他关键功能。
系统服务是由Android操作系统管理和提供的,应用程序可以通过系统服务与这些功能进行通信。
一些常见的系统服务包括:1. ActivityManager: 管理应用程序的生命周期和任务栈。
2. PackageManager: 管理应用程序的安装、卸载和信息查询。
3. WindowManager: 管理窗口和界面元素。
4. NotificationManager: 管理通知。
5. TelephonyManager: 提供与电话相关的信息和功能。
6. ConnectivityManager: 管理网络连接。
7. LocationManager: 提供地理位置信息。
8. PowerManager: 管理设备的电源状态。
9. AudioManager: 控制音频设置和管理音频。
10. SensorManager: 管理设备上的传感器。
11. Vibrator: 控制设备的振动。
这些系统服务是通过`Context`对象的`getSystemService()`方法获得的。
例如,要获取`AudioManager`:```javaAudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);```这里的`Context`是Android应用程序的一个关键组件,提供了应用程序的全局信息和对Android环境的访问权限。
系统服务的使用使应用程序能够访问设备功能,而无需实现这些功能的底层逻辑。
这样,Android提供了一种标准的接口,允许应用程序开发者专注于其应用的特定功能,而不必处理底层的硬件和系统细节。
Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务
Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务Service简介Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。
Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开另一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。
当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行后台服务后台服务可交互性主要是体现在不同的启动服务方式,startService()和bindService()。
bindService()可以返回一个代理对象,可调用Service中的方法和获取返回结果等操作,而startService()不行不可交互的后台服务不可交互的后台服务即是普通的Service,Service的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。
当我们startService()的时候,首次创建Service会回调onCreate()方法,然后回调onStartCommand()方法,再次startService()的时候,就只会执行一次onStartCommand()。
服务一旦开启后,我们就需要通过stopService()方法或者stopSelf()方法,就能把服务关闭,这时就会回调onDestroy()一、创建服务类创建一个服务非常简单,只要继承Service,并实现onBind()方法public class BackGroupService extends Service {/*** 綁定服务时调用** @param intent* @return*/@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.e("Service", "onBind");return null;}/*** 服务创建时调用*/@Overridepublic void onCreate() {Log.e("Service", "onCreate");super.onCreate();}/*** 执行startService时调用** @param intent* @param flags* @param startId* @return*/@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { Log.e("Service", "onStartCommand");//这里执行耗时操作new Thread() {@Overridepublic void run() {while (true){try {Log.e("Service", "doSomething");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();return super.onStartCommand(intent, flags, startId);}/*** 服务被销毁时调用*/@Overridepublic void onDestroy() {Log.e("Service", "onDestroy");super.onDestroy();}}二、配置服务Service也是四大组件之一,所以必须在manifests中配置<service android:name=".Service.BackGroupService"/>三、启动服务和停止服务我们通过两个按钮分别演示启动服务和停止服务,通过startService()开启服务,通过stopService()停止服务public class MainActivity extends AppCompatActivity {Button bt_open, bt_close;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);bt_open = (Button) findViewById(R.id.open);bt_close = (Button) findViewById(R.id.close);final Intent intent = new Intent(this, BackGroupService.class);bt_open.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动服务startService(intent);}});bt_close.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//停止服务stopService(intent);}});}}当你开启服务后,还有一种方法可以关闭服务,在设置中,通过应用->找到自己应用->停止四、运行代码运行程序后,我们点击开始服务,然后一段时间后关闭服务。
Android中的Service概念及用途
Service概念及用途Android中的Service,其意思是“服务”,它是在后台运行,不可交互的。
Service自己不能运行,需要通过某一个Activity或者其它Context对象来调用,如Context .startService() 和Context.bindService()两种方式启动Service 。
Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以用Service在后台定时更新,而不用每打开应用的时候在去获取。
如果在Service的onCreate或者onStart方法中做一些很耗时的动作,最好是启动一个新线程来运行这个Service,因为,如果Service运行在主线程中,会影响到程序的UI操作或者阻塞主线程中的其它事情。
Service生命周期Service的生命周期方法比Activity要少一些,只有onCreate、onStart、onDestroy。
有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1)通过startService启动Service启动的时候会经历生成开始(onCreate onStart)过程,Service停止的时候直接进入销毁过程(onDestroy)。
而如果是调用者直接退出而没有调用stopService,Service会一直在后台运行。
直到下次调用者再启动起来,并明确调用stopService。
2)通过bindService启动通过bindService方法启动Service,其只会运行onCreate方法,如果调用退出了,Service会调用onUnbind,onDestroyed方法。
android service的用法
在Android开发中,Service是一种用于在后台执行长时间运行操作的组件,而不提供用户界面的应用程序组件。
以下是使用Android Service的一些基本用法:1.定义Service类:创建一个继承自Service的类,并重写其中的一些方法来执行所需的操作。
例如,可以在Service中执行网络请求、文件读写等操作。
2.注册Service:在AndroidManifest.xml文件中注册Service,以便系统可以找到并启动它。
例如:php复制代码<service android:name=".MyService" />3.启动Service:在Activity或其他组件中,使用Context的startService()方法来启动Service。
例如:java复制代码Intent intent = new Intent(this, MyService.class);startService(intent);4.绑定Service:如果需要在Service和Activity之间进行通信,可以使用bindService()方法来绑定Service。
通过回调接口,可以在Service和Activity之间传递数据或执行操作。
5.处理生命周期:由于Service在后台运行,不受Activity的生命周期限制,因此需要处理其自身的生命周期。
在Service中重写onStartCommand()或onBind()方法来执行所需的操作,并在不再需要时调用stopSelf()方法来停止Service。
6.通知用户:如果需要在Service执行某些操作时通知用户,可以使用NotificationManager来发送通知。
例如,可以在Service中发送一个通知,告知用户数据已成功下载或上传。
需要注意的是,使用Service需要谨慎处理资源的释放和生命周期的管理,以避免内存泄漏和资源浪费。
AndroidService生命周期详解
AndroidService⽣命周期详解引⾔应⽤程序组件有⼀个⽣命周期——⼀开始Android实例化他们响应意图,直到结束实例被销毁。
在这期间,他们有时候处于激活状态,有时候处于⾮激活状态;对于活动,对⽤户有时候可见,有时候不可见。
组件⽣命周期将讨论活动、服务、⼴播接收者的⽣命周期——包括在⽣命周期中他们可能的状态、通知状态改变的⽅法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。
上篇Android开发之旅:组件⽣命周期(⼀)讲解了论活动的⽣命周期及他们可能的状态、通知状态改变的⽅法。
本篇将介绍服务和⼴播接收者的⽣命周期:服务⽣命周期⼴播接收者⽣命周期1、服务⽣命周期⼀个服务可以⽤在两个⽅⾯:它可以启动且允许⼀直运⾏直到有⼈停⽌它,或者它⾃⼰停⽌。
在这种模式,通过调⽤Context.startService()启动服务及通过调⽤ Context.stopService()停⽌服务。
服务也可以通过调⽤Service.stopSelf()或 Service.stopSelfResult()停⽌⾃⼰。
仅需要调⽤⼀次stopService()停⽌服务,⽽不管调⽤ startService()了多少次。
通过使⽤相关接⼝可以编程地操作服务。
客户端建⽴与Service对象的⼀个连接及使⽤该连接调⼊服务。
连接通过调⽤Context.bindService()建⽴,通过调⽤Context.unbindService()关闭。
多个客户端可以绑定到同⼀个服务。
如果服务尚未启动,bindService()可以选择启动它。
这两种模式并不是完全分离的。
你可以绑定到⼀个⽤startService()启动的服务。
例如,⼀个后台⾳乐服务可以通过使⽤定义了⾳乐播放的 Intent对象调⽤startService()启动。
直到后来,⽤户可能想对播放器做⼀些控制或者获取当前歌曲的⼀些信息,⼀个活动将调⽤ bindService()与服务建⽴连接。
Android系统开发的基础知识与技巧
Android系统开发的基础知识与技巧Android系统已经成为现代移动设备的主流操作系统之一。
无论是应用程序开发还是系统级别开发,对其有着充分的掌握是非常重要的。
本文将介绍Android系统开发的基础知识与技巧,旨在帮助开发者更好地理解和使用Android系统。
1. Android框架Android框架定义了Android系统的核心组件,这些组件共同构成了整个Android系统的运行环境。
其中最重要的是四大组件:Activity、Service、Broadcast Receiver和Content Provider。
- Activity是Android系统界面的主要表现形式,它充当用户与应用程序之间的中介。
- Service是Android系统的一种后台服务,提供长时间运行的后台功能,如音乐播放器和位置监听器。
- Broadcast Receiver是系统事件的接收器,允许应用程序监听系统事件和自定义事件。
- Content Provider则需要管理应用程序中的数据访问、共享和保护。
这些组件可以构建复杂而灵活的应用程序,同时也可以自由地使用其它语言和框架,如Java、Kotlin、React Native和Flutter。
2. Android视图Android视图是Android开发中的核心应用程序。
它们允许开发人员创建应用程序的图形用户界面(GUI)。
在Android中,应用程序的GUI可以通过视图树组织起来。
在Android中,视图通常包括基本构建块,例如TextView、ImageView、EditText和Button。
它们允许开发者自由地选择尺寸和位置,颜色和样式。
此外,Android视图还可以通过自定义视图创建新的UI元素。
3. Android资源Android开发环境允许开发者将应用程序的资源分离成各种组件,如图像、音频和用户交互元素等。
然后,可以通过代码或布局文件将它们组合在一起。
麦子学院Android开发教程Service组件介绍
在Android工作中,如果计算量较大,又不是UI层的工作,可以考虑将这部分工作放置在Service中。
目前Android中Service的应用非常广泛,尤其是在框架层,应用更多的是对系统服务的调用。
今天首先介绍几个常用的系统服务。
为了将Service纳入编译系统,必须在AndroidManifest.xml中对Service进行显式声明,方法如下:<service android:name=".service.TestService"></service>1. InputMethodServiceInputMethodService提供了一个输入法的标准实现,普通开发者不必关心这一点,ODM 厂商和输入法企业则需考虑。
一种输入法在界面上由3部分构成,即软输入视图(Soft Input View)、候选视图(Candidates View)和全屏模式(Fullscreen Mode)。
在实现自定义的输入法时,有以下几个回调方法需要注意:public void onInitializeInterface()public void onBindInput()public void onStartInput(EditorInfo attribute, boolean restarting)public View onCreateCandidatesView()public View onCreateInputView()public View onCreateExtractTextView()public void onStartInputView(EditorInfo info, boolean restarting)在Android中,Google提供了一个名为SoftKeyboard的自定义输入法示例,有兴趣的读者可查阅相关资料,本书就不再详述。
2. IntentServiceIntentService作为Service的子类,主要用于处理异步请求,防止服务阻塞。
Android--四大基本组件
Android--四⼤基本组件Android四⼤基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver⼴播接收器。
⼀、四⼤基本组件1.Activity应⽤程序中,⼀个Activity通常就是⼀个单独的屏幕,它上⾯可以显⽰⼀些控件也可以监听并处理⽤户的事件做出响应。
Activity之间通过Intent进⾏通信。
在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。
⽽动作对应的数据则以URI 的形式进⾏表⽰。
例如:要查看⼀个⼈的联系⽅式,你需要创建⼀个动作类型为VIEW 的intent,以及⼀个表⽰这个⼈的URI。
与之有关系的⼀个类叫IntentFilter。
相对于intent 是⼀个有效的做某事的请求,⼀个intentfilter则⽤于描述⼀个activity(或者IntentReceiver)能够操作哪些intent。
⼀个activity 如果要显⽰⼀个⼈的联系⽅式时,需要声明⼀个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表⽰⼀个⼈的URI。
IntentFilter 需要在AndroidManifest.xml 中定义。
通过解析各种intent,从⼀个屏幕导航到另⼀个屏幕是很简单的。
当向前导航时,activity 将会调⽤startActivity(Intent myIntent)⽅法。
然后,系统会在所有安装的应⽤程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。
新的activity 接收到myIntent 的通知后,开始运⾏。
当startActivity ⽅法被调⽤将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利⽤从其它组件中以Intent 的形式产⽣的⼀个请求;B、Activities 可以在任何时候被⼀个具有相同IntentFilter 的新的Activity 取代。
Android的四大组件
Android的四⼤组件Android的四⼤组件:Activity、Service、BroadcastReceiver、Content Provider。
Content Provider 属于Android应⽤程序的组件之⼀,作为应⽤程序之间唯⼀的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应⽤程序提供访问数据的接⼝① Activity是Android应⽤中负责与⽤户交互的组件——⼤致上把它想象成Swing编程中的JFrame控件。
不过它与JFrame的区别在于:JFrame本⾝可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显⽰指定组件。
Activity为Android应⽤提供⾥可视化⽤户界⾯,如果该Android应⽤需要多个⽤户界⾯,那么这个Android应⽤将会包含多个Activity,多个Activity组成Activity栈。
当前活动的Activity位于栈顶。
View组件是所有UI控件、容器控件的基类,View组件就是Android应⽤中⽤户实实在在看到的部分。
但View组件需要放到容器组件中,或者使⽤Activity将它显⽰出来。
如果需要通过某个Activity把指定View显⽰出来,调⽤Activity的setContentView()⽅法即可。
② Service与Activity的地位是并列的,它也代表⼀个单独的Android组件。
Service与Activity的区别在于:Service通常位于后台运⾏,它⼀般不需要与⽤户交互,因此Service组件没有图形⽤户界⾯。
Service组件需要继承Service基类。
⼀个Service组件被运⾏起来之后,它将拥有⾃⼰独⽴的⽣命周期,Service组件通常⽤于为其他组件提供后台服务或监控其他组件的运⾏状态。
③ BroadcastReceiver是Android应⽤中另⼀个重要的组件,BroadcastReceiver代表⼴播消息接收器。
第八章Service详解讲解
倚动软件工厂实验室
主要内容
Service详解
Service简介
跨进程调用 Service
调用系统服务
Service Service方法介绍
启动Service 绑定Service过程 Service生命周期 什么是AIDL服务 建立AIDL文件 建立AIDL服务端 建立AIDL客户端
注意:未启动而直接停止不起作用,但未绑定而先解绑则程序出错,强制退出。若该 Service处于绑定状态下,该Service不会被停止即单击停止按钮不起作用,当单击解除按钮 时,它会先解除绑定随后直接销毁,若在解除之前,没有单击停止,则只解除不会销毁。
Service的生命周期
1、先启动后绑定 2、先绑定后启动
案例总结
方法调用顺序: 1、startService启动Service的顺序: onCreate()àonStartCommand()[1到多次]àonDestory() 2、bindService启动Service的顺序: onCreate()àonBind()àonServiceConnection()àonUnbind()àonDestory() 3、二者混合使用
注意事项
Action中的值一定要与程序中创建的Intent的Action的值一 致,程序是根据Action的值来查找相应的Service从而启动它。 在为Service注册后,我们便可以通过startService()或 BindService()方法来启动该Service。通过stopService()来停 止Service,unbindService()来解除与Service的绑定。
<service android:name=“.MyService”> <intent-filter> <action android:name=“.android.MyService”/> </intent-filter>
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android系统组件Service详解
Android中的服务类似windows中的服务,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
服务的开发比较简单,如下:
第一步:继承Service类
public class MyService extends Service { }
第二步:在AndroidManifest.xml文件中的节点里对服务进行配置:
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
这两个方法都可以启动Service,但是它们的使用场合有所不同。
使用startService()方法启用服务,访问者与服务之间没有关连,即使访问者退出了,服务仍然运行。
使用bindService()方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
采用Context.startService()方法启动服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
通过startService()和stopService()启动关闭服务。
适用于服务和访问者之间没有交互的情况。
如果服务和访问者之间需要方法调用或者传递参数,侧需要使用bindService()和unbindService()方法启动关闭服务。
采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。
如果访问者要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。
如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。
如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
服务的生命周期跟启动服务的方法有关:
当采用Context.startService()方法启动服务,与之有关的生命周期方法
onCreate()、 onStart() 、onDestroy()
onCreate()该方法在服务被创建时调用
该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。
该方法在服务开始运行时被调用。
多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate()--> onBind() --> onUnbind() --> onDestroy() onBind()只有采Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate()-->onStart()-->onBind()-->onUnbind()[重载后的方法需返回true]-->onRebind() 资料来源——北大青鸟软件园校区网上学堂/。