第10讲 android service详解

private ServiceConnection serviceConnection = new ServiceConnection(){ @Override public void onServiceDisconnected(ComponentName name) { myService = null; }
<action android:name="net.blogjava.mobile.myService" /> </intent-filter>
</service>
6
Service起步
(3)如果要开始一个服务,使用startService方法,停止一个服务要使用 stopService方法。此时需要使用Intent对象
参数介绍: Service:表示与服务类相关联的Intent对象 Conn:是一个ServiceConnection类型的变量,负责连接Intent对象指定的服 务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以 获得连接后的服务对象。 flags:是一个标志位,一般设为Context.BIND_AUTO_CREATE
一般需要将<service>标签的android:enabled属性值设为true, 并使用android:name属性指定在第1步建立的服务类名
或者使用如下方式配置:何时使用? <service android:enabled="true" android:name=".MyService">
<intent-filter>
本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动 Service的各种方法
3
Service起步
Service的生命周期: 参考 ch10_servicelifecycle
Service与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程 比Activity简单得多。 一个服务实际上是一个继承android.app.Service的类
启动服务对象的定义注意事项:
2、调用bindService()方法绑定服务类,同时启动服务
serviceIntent = new Intent(this, MyService.class);
bindService(serviceIntent, serviceConnection,Context.BIND_AUTO_CREATE);
一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和 onDestroy方法只会被调用一次,而onStart方法会被调用多次。
4
Service起步
创建和使用Service的步骤
创建和开始一个服务需要如下3步: (1)编写一个服务类,该类必须从android.app.Service继承。
13
绑定Activity和Service—启动服务的另外一种方法
启动服务对象的定义注意事项:
1、定义ServiceConnection,该对象将在bindService方法中使用, 该对象的onServiceConnected方法中,可以获取到Ibiinder接口的实现类,通
过该类可以得到service实例,从而启动服务的对象即可以调用service的方法。
}
8
Service起步
(4)其他例子代码片பைடு நூலகம்:
public class MusicService extends Service { @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onStart(Intent intent, int startId) {
Data Warehouse
Android平台手机嵌入式开发
Android service
主要内容:
Service起步 系统服务
时间服务
跨进程访问
1
Service概述
服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2
节的内容)。服务主要用于两个目的:后台运行和跨进程访问
15
绑定Activity和Service—启动服务的另外一种方法
其他例子介绍:
1、服务的创建
public class BindMusicService extends Service { private final IBinder binder = new MyBinder(); public class MyBinder extends Binder { BindMusicService getService() { return BindMusicService.this; } @Override public IBinder onBind(Intent intent) { play(); return binder; @Override } }
serviceIntent.putExtras(bundle);
startService(serviceIntent);
//启动服务
stopService(serviceIntent);
//停止服务
7
Service起步
(4)其他例子代码片段:
public class PlayMusic extends Activity implements OnClickListener { private Button playBtn,stopBtn; @Override public void onClick(View v) { int op = -1; Intent intent = new Intent("org.allin.android.musicService"); switch (v.getId()) {
通过bindService方法可以将Activity和Service绑定,并启动服务,
参考案例:
ch10_serviceactivity
10
绑定Activity和Service—启动服务的另外一种方法
bindService方法的定义:
public boolean bindService(Intent service,ServiceConnection conn, int flags)
public class MyService extends Service{ @Override public IBinder onBind(Intent intent)
@Override public void onCreate() 。。。。 Service类涉及到3个生命周期方法,但这3个方法并不一定在子类中覆盖,可根
case R.id.play:
op = 1; case R.id.stop: op = 2; break; break;
}
Bundle bundle = new Bundle(); bundle.putInt("op", op); intent.putExtras(bundle);
startService(intent);
if (intent != null) {
Bundle bundle = intent.getExtras(); if (bundle != null) { int op = bundle.getInt("op");
switch (op) {
case 1: play(); break; case 2:
这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context 退出了,Srevice就会调用onUnbind->onDestroy相应退出
12
绑定Activity和Service—启动服务的另外一种方法
服务定义注意事项:
1、定义IBinder接口的实现类,可以继承Binder类来创建 public class MyBinder extends Binder { MyService getService() { return MyService.this; } } 2、重写onBind方法,并返回IBinder接口的实现类 @Override public IBinder onBind(Intent intent) { Log.d("MyService", "onBind"); return myBinder; } 该实现类将在ServiceConnection对象中使用,获取service对象
//构造Intent对象
Intent serviceIntent = new Intent(this, MyService.class); 或者
Intent serviceIntent = new Intent("net.blogjava.mobile.myService");
Bundle bundle = new Bundle(); bundle.putInt("op", op);
11
绑定Activity和Service—启动服务的另外一种方法
调用bindService方法后的生命周期:
生命周期如下: 调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) -> onUnbind --> onDestory
onBind将返回给客户端一个IBinder接口实例,IBinder允许客户端回调服务的方 法,比如得到Service运行的状态或其他操作。
合集下载

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

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);

Service详解

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 systemservice类理解

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类的实例会被创建并初始化。

简述service原理

简述service原理

简述service原理Service是一种Android四大组件之一,它可以在后台执行长时间运行的操作,即使用户切换到其他应用程序,也可以继续运行。

Service通常用于处理网络请求、播放音频、下载文件等耗时操作。

Service有两种类型:Started Service和Bound Service。

Started Service是通过startService()方法启动的,它会在后台执行一个任务并且不与Activity绑定。

当任务完成时,Service会自动停止。

Started Service可以通过stopService()方法或者stopSelf()方法来手动停止。

Bound Service是通过bindService()方法绑定的,它与Activity进行绑定,并且Activity可以与之进行交互。

Bound Service通常用于提供客户端-服务器接口,例如音乐播放器应用程序中的服务。

Service的生命周期包括onCreate()、onStartCommand()、onBind()、onUnbind()和onDestroy()五个方法。

当第一次启动Service时,系统会调用onCreate()方法来初始化服务。

在这个方法中通常会进行一些初始化工作,例如获取资源等。

当调用startService()方法启动服务时,系统会调用onStartCommand()方法来执行任务。

在这个方法中需要处理Intent 参数,并且返回一个整数值来表示服务如何处理异常情况。

当调用bindService()方法绑定服务时,系统会调用onBind()方法来返回一个IBinder对象给客户端使用。

客户端可以使用这个对象与服务进行交互。

当客户端解除绑定服务时,系统会调用onUnbind()方法来释放资源。

如果没有任何客户端与服务绑定,系统会调用onDestroy()方法来销毁服务。

总之,Service是一种非常有用的组件,它可以在后台执行长时间运行的操作,并且可以与Activity进行交互。

android五大组件详解

android五大组件详解

初识Android上层应用5大基本组件收藏5 Basic Components1. Activity2. Service3. Broadcast Receiver4. Content Provider5. IntentActivity ——应用表示层(基类Activity)应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的。

同一应用中的每个Activity是相互独立的。

程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activity启动另一个新的Activity。

Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序做交互)。

Activity窗口内的可见内容通过基类View提供。

使用Activity.setContentView()方法设置当前Activity中的View对象。

●每个View对象控制着窗口内的一个矩形空间;●View是一种层次化结构,Parent View中的布局属性会被子View继承;●位于View层次关系最底层的子View对象所代表的矩形空间就是跟用户进行交互的地方Activity状态回调:●onCreate●onStart●onRestart●onResume●onPause●onStop●onDestroyService——没有可见的用户界面,但能够长时间运行于后台(基类Service)运行于应用程序进程的主线程中,因此Service不会阻塞其他组件和用户界面。

Service是不能自己启动的,必须通过Context对象(如一个Activity)调用startService 或bindService方法来启动(用这两种方法启动的Service的生命周期不同)。

1. 调用startService方法a) 若Service没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。

Android中的分层----service层,domain层,dao层,action层等设计

Android中的分层----service层,domain层,dao层,action层等设计service 层服务层:直接为客户端提供的服务或功能。

也是系统所能对外提供的功能。

domain层领域层:系统内的领域活动,存放实体。

dao 层持久层,DB操作都写在这⾥,数据访问对象,通过领域实体对象来操作数据库。

biz层业务层,我只做某⽅⾯的业务处理,如果需要数据库⼯作,联系下数据部门(dao)协助我,业务层不会出现数据操作代码action层控制层,MVC中充当C⾓⾊,⽤来分配哪个业务来处理⽤户请求。

common层通⽤⼯具包,⼀般⼀个公司会有固定的jar,好⼏个项⽬通⽤的,例如远程调⽤等⼯作流程:⼀个请求发送到action(作⽤:MVC中的C),action控制它发送到哪个biz处理,如果⽤到数据库,那么biz在连接dao,然后返回要的数据,最后action在返回响应的页⾯(⽐如jsp),因为是⾯向对象,所以实体domain在中间传递数据。

以上为⼯作流程. 其中有些指导原则: 1、上层总是依赖其下层,依赖关系不跨层。

2、表现层除外,同⼀层之间⽅法不允许相互调⽤。

这是实际开发中⼀些开发者容易范的错误!如果真是同⼀层之间存在⽅法调⽤,需要注意,这些调⽤都是⼀些上层不可见⽅法,⽐如⼀些⼯具⽅法等。

3、⼀切从服务层出发,从系统需要提供的功能进⾏分析,确定Service接⼝中的⽅法。

⽽不是从数据库的表出发,创建DAO,再创Domain,然后Service,这实际上是对系统分层的误解。

4、系统最核⼼的设计就是将系统中的实体划分为领域模型。

在此基础上设计数据的DAO层,并将这些活动暴露给服务层,服务层的实现依赖于领域活动。

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。

Service具体解释(一):什么是Service

Service具体解释(⼀):什么是ServiceService是Android中经常使⽤组件之中的⼀个,它是Android中实现程序后台执⾏的解决⽅式,它⾮常适合⽤于去执⾏那些不须要和⽤户交互且还要长期执⾏的任务。

这⾥的后台并⾮⼦线程的意思。

Service默认并不会执⾏在⼦线程中。

它也不会执⾏在⼀个独⽴的进程中,它相同执⾏在UI线程中,因此,不要在Service中执⾏耗时的操作。

假设须要执⾏耗时的操作,能够在Service中创建⼦线程来完毕耗时操作。

Service的执⾏不依赖于不论什么⽤户界⾯,及时程序被切换到后台或者⽤户打开了另外⼀个应⽤程序,Service仍然能够保持正常执⾏。

这也正式Service的使⽤场景。

当某个应⽤程序进程被杀掉时,全部依赖于该进程的Service也会停⽌执⾏。

Service 与 Thread的差别⾮常多时候,你可能会问,为什么要⽤ Service。

⽽不⽤ Thread 呢。

由于⽤ Thread 是⾮常⽅便的,⽐起 Service 也⽅便多了,以下我具体的来解释⼀下。

1). Thread:Thread 是程序执⾏的最⼩单元,它是分配CPU的基本单位。

能够⽤ Thread 来执⾏⼀些异步的操作。

2). Service:Service 是android的⼀种机制,当它执⾏的时候假设是Local Service。

那么相应的 Service 是执⾏在主进程的 main 线程上的。

如:onCreate。

onStart 这些函数在被系统调⽤的时候都是在主进程的 main 线程上执⾏的。

假设是Remote Service,那么相应的Service 则是执⾏在独⽴进程的 main 线程上。

因此请不要把 Service 理解成线程,它跟线程半⽑钱的关系都没有!上⾯的描写叙述还是不够直观,要想真正理解Service与Thread的差别,我么要冲android的系统机制或者功能上来分析了。

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提供了一种标准的接口,允许应用程序开发者专注于其应用的特定功能,而不必处理底层的硬件和系统细节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档