Android服务-Service
- 格式:doc
- 大小:761.50 KB
- 文档页数:48
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对象。
Android 应用程序的基本组件Android 操作系统是目前世界上最流行的移动操作系统之一。
它提供了广泛的应用程序开发工具和框架,使开发者能够轻松地创建出丰富多样的应用程序。
而这些应用程序的基础是由一些基本组件构成的。
本文将介绍 Android 应用程序的基本组件,包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。
活动(Activity)是 Android 应用程序的核心组件之一。
它代表了用户与应用程序之间的交互界面。
每个 Android 应用程序都至少包含一个活动,而活动可以包含多个界面元素,例如按钮、文本框、图像等。
活动通过布局文件定义了界面的外观和布局,通过代码来处理用户的操作和响应。
活动之间可以通过意图(Intent)来进行切换和通信,从而实现应用程序之间的流转和交互。
服务(Service)是在后台运行的组件,它可以在没有用户界面的情况下执行长时间运行的操作。
服务通常用于执行一些独立的任务,例如播放音乐、下载文件等。
通过在应用程序中创建服务,开发者可以在用户不可见的情况下执行一些必要的操作,并提供持久性的后台功能。
广播接收器(Broadcast Receiver)是一种用于接收系统广播消息的组件。
广播是 Android 系统中不同组件之间进行通信的一种方式,例如设备启动完成、电池电量变化等。
通过注册一个广播接收器,开发者可以监听和响应系统广播消息,并执行相应的操作。
广播接收器可以用于实现各种功能,例如接收短信、接收网络状态变化等。
内容提供器(Content Provider)是 Android 中用于共享数据的一种机制。
内容提供器允许一个应用程序将其数据暴露给其他应用程序。
通过内容提供器,不同的应用程序可以相互访问和共享数据,实现数据的交互和共用。
例如,系统提供的联系人数据库就是通过内容提供器来共享和访问联系人数据的。
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 Service所谓的service有Local Service和Remote Service区分:LocalService:就是client和Service在同一个进程当中。
RemoteService:就是client 和Service在不同的进程中。
我们通常的用法是自己建一个.java文件中通过继承Service来实现一个子Service。
然后在通过其他的Activity来连接实现的那个Service就有点像网络编程中的链接服务器一样。
但是这里的Service不是独立的一个服务器端,它可以说是手机app的一个实现模块。
所以不是像传统的网络编程一样,首先启动服务器,然后在从client去访问。
android中的Service 要通过访问端通过传递消息(Intent)去开启Service。
通常有两种方法去启动一个Service。
一)context.startService()启动方式public abstract ComponentName startService(Intent service)通过函数的原型我们可以看出是一个Component去调用的,参数就是一个Intent,在该Intent中去指定一些规则和消息来启动符合条件的Service。
The Intent can either contain the complete class name of a specific service implementation to start, or an abstract definition through the action and other fields of the kind of service to start(by gg doc).此时我们明确了client端发出去Intent去启动Service的过程,但是Service端是怎么来响应的?然后怎么启动你实现的子Service的呢?Every call to this method(startService(Intent intent))will result in a corresponding call to the target service'sonStartCommand(Intent, int, int)(by gg doc)就是each component调用startService(Intent intent)来启动Service的时候,service端作出的响应就是call onStartCommand(Intent,int,int)函数public int onStartCommand (Intent intent, int flags, int startId)当调用该函数的时候intent对象就是startService(Intent intent)红传递过来的intent对象。
Android Service如何开机自启动以及自启动失败原因本文主要介绍Android Service如何开机自启动、自启动失败的原因、adb命令发送BOOT_COMPLETED。
应用程序是否可以在安装后自启动,没有ui的纯service应用如何启动?1、Android应用如何开机自启动(1)、在AndroidManifest.xml中注册AndroidManifest.xml中注册BOOT_COMPLETED Action注意不仅要添加android.intent.action.BOOT_COMPLETED对应的action,还需要添加对应的uses-permission(2)、Receiver接收广播进行处理public class BootBroadcastReceiver extends BroadcastReceiver {public static final String TAG = "BootBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction().toString();if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {// u can start your service hereToast.makeText(context, "boot completed action has got", Toast.LENGTH_LONG).show();return;}}}2、自启动失败的原因接收不到BOOT_COMPLETED广播可能的原因(1)、BOOT_COMPLETED对应的action和uses-permission没有一起添加(2)、应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的(3)、系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播(4)、应用程序安装后重来没有启动过,这种情况下应用程序接收不到任何广播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
android中的用法在Android开发中,Android SDK提供了一系列API和工具,用于创建和管理应用程序。
以下是一些在Android开发中常用的用法:1. Activity:Activity是Android应用程序中的一个基本单元,它是用户可以交互的界面。
一个应用程序可以包含多个Activity,每个Activity负责展示一个用户界面并响应用户的操作。
2. Intent:Intent是Android应用程序中不同组件之间通信的方式。
它可以用来启动一个Activity或传递数据到另一个组件。
通过使用Intent,您可以创建一个显式或隐式启动另一个Activity的请求。
3. Service:Service是Android应用程序中的后台服务,它可以在应用程序的主界面之外运行。
Service可以在后台执行长时间运行的任务,例如播放音乐、从网络下载数据或与远程服务器通信。
4. BroadcastReceiver:BroadcastReceiver是Android应用程序中用于接收系统广播的组件。
系统广播是Android系统发出的通知,例如电池电量低、收到短信或电话等。
通过使用BroadcastReceiver,您可以编写一个监听器来接收这些通知,并在接收到通知时执行相应的操作。
5. SQLite数据库:SQLite是一个轻量级的关系型数据库,它在Android应用程序中广泛使用。
通过使用SQLite数据库,您可以存储和检索应用程序的数据,并在需要时检索这些数据。
6. AndroidManifest.xml:AndroidManifest.xml是Android应用程序的配置文件。
它包含了应用程序的基本信息和配置信息,例如应用程序的名称、版本、权限和活动、服务、广播接收器等组件的声明。
以上是一些在Android开发中常用的用法,当然还有其他许多API 和工具可供使用。
通过使用这些API和工具,您可以创建出功能强大、用户体验良好的Android应用程序。
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 重启现在有这样的需求,防止自己的app被其他的应用程序(比如qq手机管家)杀死,该怎么实现呢。
我们知道app都是运行在进程中的,android是怎样管理这些进程的呢。
要想app不被杀死,只要做到进程不被结束就解决了问题。
但是不幸的是,第三方app很容易利用系统的api(比如killBackProgress())轻易杀死其他进程。
那该怎么办呢?目前有这样的解决方案。
在本进程被其他应用程序杀死后,就立即重启,这样就可以间接防止进程被结束(其实已结束了,只重新开启)。
至今为止,还未知道怎样完全防止第三方结束本进程,正在寻找中。
现在问题又来了,自己的应用怎么知道什么时候被杀死了,杀死之后又怎么重启呢?答案是,无法知道,自己也无法重启。
幸好android提供了service,android规范中指出进驻有service的进程的优先级别很高,除非是本应用自己调用stopService结束服务,否则即使第三方应用杀死该进程,而后进程也会自己重启(服务也重启)所以说,要想进程被杀死后能自动重启,那么只需要在该进程中开启某个服务就可以了。
补充:1、通过设定-》应用程序-》运行结束某个进程或服务,这样进程或服务不会重启。
2、如果采用bindService()方法启动服务,那么在设定-》应用程序-》运行是看不到此项服务信息的。
这样的服务也可被”qq手机管家“永远杀死,不在重启。
结论:无法防止其他应用程序杀死自己进程或服务(系统自带的服务管理外),但是可以在杀死后重启。
另外,可以设置service属性:每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,这个方法return 一个int值,return 的值有四种:START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。
第8章Android服务-Service∙ 8.1 Service起步∙ 8.1.1 Service的生命周期∙ 8.1.2 绑定Activity和Service ∙ 8.1.3 在BroadcastReceiver中启动Ser..∙ 8.2.1 获得系统服务∙ 8.2.2 在模拟器上模拟重力感应∙ 8.3.1 计时器:Chronometer ∙ 8.3.2 预约时间Handler∙ 8.3.4 在线程中更新GUI组件∙ 8.3.5 全局定时器AlarmManager(1)∙ 8.3.5 全局定时器AlarmManager(2)∙ 8.3.5 全局定时器AlarmManager(3)∙ 8.4.1 什么是AIDL服务∙ 8.4.2 建立AIDL服务的步骤(1)∙ 8.4.2 建立AIDL服务的步骤(2)∙ 8.4.2 建立AIDL服务的步骤(3)∙ 8.5 本章小结第8章Android服务服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。
服务主要用于两个目的:后台运行和跨进程访问。
通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。
通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。
本章内容Service的生命周期绑定Activity和Service在BroadcastReceiver中启动Service系统服务时间服务在线程中更新GUI组件AIDL服务在AIDL服务中传递复杂的数据8.1 Service起步Service并没有实际界面,而是一直在Android系统的后台运行。
一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。
本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。
8.1.1 Service的生命周期本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycleService与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。
Service启动到销毁的过程只会经历如下3个阶段:创建服务开始服务销毁服务一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service 类中的3个事件方法进行交互,这3个事件方法如下:1.public void onCreate(); // 创建服务2.public void onStart(Intent intent, int startId); // 开始服务3.public void onDestroy(); // 销毁服务一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。
下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。
1.package net.blogjava.mobile.service;2.import android.app.Service;3.import android.content.Intent;4.import android.os.IBinder;5.import android.util.Log;6.7.// MyService是一个服务类,该类必须从android.app.Service类继承8.public class MyService extends Service9.{10. @Override11. public IBinder onBind(Intent intent)12. {13. return null;14. }15. // 当服务第1次创建时调用该方法16. @Override17. public void onCreate()18. {19. Log.d("MyService", "onCreate");20. super.onCreate();21. }22. // 当服务销毁时调用该方法23. @Override24. public void onDestroy()25. {26. Log.d("MyService", "onDestroy");27. super.onDestroy();28. }29. // 当开始服务时调用该方法30. @Override31. public void onStart(Intent intent, int startId)32. {33. Log.d("MyService", "onStart");34. super.onStart(intent, startId);35. }36.}在MyService中覆盖了Service类中3个生命周期方法,并在这些方法中输出了相应的日志信息,以便更容易地观察事件方法的调用情况。
读者在编写Android的应用组件时要注意,不管是编写什么组件(例如,Activity、Service等),都需要在AndroidManifest.xml文件中进行配置。
MyService类也不例子。
配置这个服务类很简单,只需要在AndroidManifest.xml文件的<application>标签中添加如下代码即可:1.<service android:enabled="true"android:name=".MyService"/>其中android:enabled属性的值为true,表示MyService服务处于激活状态。
虽然目前MyService是激活的,但系统仍然不会启动MyService,要想启动这个服务。
必须显式地调用startService方法。
如果想停止服务,需要显式地调用stopService方法,代码如下:1.public void onClick(View view)2.{3. switch (view.getId())4. {5. case R.id.btnStartService:6. startService(serviceIntent);// 单击【Start Service】按钮启动服务7. break;8. case R.id.btnStopService:9. stopService(serviceIntent);// 单击【Stop Service】按钮停止服务10. break;11. }12.}其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下:1.serviceIntent = new Intent(this, MyService.class);然后单击【Stop Service】按钮,会在Message列中输出如下信息:1.onDestroy在讨论完服务的生命周期后,再来总结一下创建和开始服务的步骤。
创建和开始一个服务需要如下3步:(1)编写一个服务类,该类必须从android.app.Service继承。
Service类涉及到3个生命周期方法,但这3个方法并不一定在子类中覆盖,读者可根据不同需求来决定使用哪些生命周期方法。
在Service类中有一个onBind方法,该方法是一个抽象方法,在Service的子类中必须覆盖。
这个方法当Activity与Service 绑定时被调用(将在8.1.3节详细介绍)。
(2)在AndroidManifest.xml文件中使用<service>标签来配置服务,一般需要将<service>标签的android:enabled属性值设为true,并使用android:name属性指定在第1步建立的服务类名。
(3)如果要开始一个服务,使用startService方法,停止一个服务要使用stopService方法。
8.1.2 绑定Activity和Service本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android 系统的启动而启动,随着Android系统的关闭而关闭。
也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。
但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。
通过bindService方法可以将Activity和Service绑定。
bindService方法的定义如下:1.public boolean bindService(Intent service,ServiceConnection conn, int flags)该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。
通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。
第3个参数是一个标志位,一般设为Context.BIND_AUTO_CREATE。
下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。
1.package net.blogjava.mobile.service;2.3.import android.app.Service;4.import android.content.Intent;5.import android.os.Binder;6.import android.os.IBinder;7.import android.util.Log;8.9.public class MyService extends Service10.{11. private MyBinder myBinder = new MyBinder();12. // 成功绑定后调用该方法13. @Override14. public IBinder onBind(Intent intent)15. {16. Log.d("MyService", "onBind");17. return myBinder;18. }19. // 重新绑定时调用该方法20. @Override21. public void onRebind(Intent intent)22. {23. Log.d("MyService", "onRebind");24. super.onRebind(intent);25. }26. // 解除绑定时调用该方法27. @Override28. public boolean onUnbind(Intent intent)29. {30. Log.d("MyService", "onUnbind");31. return super.onUnbind(intent);32. }33. @Override34. public void onCreate()35. {36. Log.d("MyService", "onCreate");37. super.onCreate();38. }39. @Override40. public void onDestroy()41. {42. Log.d("MyService", "onDestroy");43. super.onDestroy();44. }45. @Override46. public void onStart(Intent intent, int startId)47. {48. Log.d("MyService", "onStart");49. super.onStart(intent, startId);50. }51. public class MyBinder extends Binder52. {53. MyService getService()54. {55. return MyService.this;56. }57. }58.}现在定义一个MyService变量和一个ServiceConnection变量,代码如下:1.private MyService myService;2.private ServiceConnection serviceConnection = new ServiceConnection()3.{4. // 连接服务失败后,该方法被调用5. @Override6. public void onServiceDisconnected(ComponentName name)7. {8.myService = null;9. Toast.makeText(Main.this, "ServiceFailed.", Toast.LENGTH_LONG).show();10. }11. // 成功连接服务后,该方法被调用。