Android Service的使用
- 格式:docx
- 大小:58.97 KB
- 文档页数:30
androidservice中stub作用是什么?1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口icp:interprocess communication :内部进程通信2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:--1.Create your .aidl file - This file defines an interface (YourI nterface.aidl) that defines the methods and fields available to a client.创建你的aidl文件,我在后面给出了一个例子,它的aidl文件定义如下:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口1.package com.cao.android.demos.binder.aidl;2.import com.cao.android.demos.binder.aidl.AIDLAc tivity;3.interface AIDLService {4.void registerTestCall(AIDLActivity cb);5.void invokCallBack();6.}--2.Add the .aidl file to your makefile - (the ADT Plugin for E clipse manages this for you). Android includes the compiler, call ed AIDL, in the tools/ directory.编译你的aidl文件,这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译:编译生成AIDLService.java如我例子中代码--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from yo ur AIDL interface. This interface has an inner abstract class name d Stub that inherits the interface (and implements a few additio nal methods necessary for the IPC call). You must create a class t hat extends YourInterface.Stub and implements the methods yo u declared in your .aidl file.实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.andr oid.demos.binder.aidl.AIDLServiceStub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:1.private final AIDLService.Stub mBinder = new AID LService.Stub() {2.3.@Override4.public void invokCallBack() throws RemoteExcepti on {5.Log("AIDLService.invokCallBack");6.Rect1 rect = new Rect1();7.rect.bottom=-1;8.rect.left=-1;9.rect.right=1;10.rect.top=1;11.callback.performAction(rect);12.}13.14.15.@Override16.public void registerTestCall(AIDLActivity cb) throw s RemoteException {17.Log("AIDLService.registerTestCall");18.callback = cb;19.}20.};Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了。
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 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几乎都是在后台运行的,一直以来它都是默默地做着辛苦的工作。
但是Service的系统优先级还是比较低的,当系统出现内存不足情况时,就有可能会回收掉正在后台运行的Service。
如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。
前台Service和普通Service最大的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。
当然有时候你也可能不仅仅是为了防止Service被回收才使用前台Service,有些项目由于特殊的需求会要求必须使用前台Service,比如说墨迹天气,它的Service在后台更新天气数据的同时,还会在系统状态栏一直显示当前天气的信息,如下图所示:
那么我们就来看一下如何才能创建一个前台Service吧,其实并不复杂,如下所示:
这里只是修改了Service中onCreate()方法的代码。
可以看到,我们首先创建了一个Notification对象,然后调用了它的setLatestEventInfo()方法来为通知初始化布局和数据,并在这里设置了点击通知后就打开MainActivity。
然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的图片显示出来。
现在重新运行一下程序, Service就会以前台Service的模式启动了,并且在系统状态栏会弹出一个通栏图标,下拉状态栏后可以看到通知的详细内容,如下图所示:
亲爱的小伙伴们你们学会了么?没学会可以关注南京宝云的官方微信,与技术大牛在线交流哦~。
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如何获取service的实例Android如何获取Service的实例Service是Android中一种非常重要的组件,是一种可以在后台执行长时间运行操作的组件。
在开发中,我们经常需要与Service进行交互,以获取其实例并执行相应的操作。
本文将详细介绍Android如何获取Service的实例,并且提供一步一步的指导。
1. 创建Service首先,我们需要创建一个Service类。
在Android中,Service类是通过继承Service基类来实现的。
我们可以通过在项目中创建一个新的Java 类,并使其继承Service类来创建一个Service。
javapublic class MyService extends Service {在这里实现Service的相关逻辑}2. 启动Service要获取Service的实例,首先我们需要在应用程序中启动Service。
可以通过调用startService()方法来启动Service。
javaIntent serviceIntent = new Intent(context, MyService.class); startService(serviceIntent);在上述代码中,我们创建了一个Intent对象,并将要启动的Service的类作为参数传递给它。
然后,我们调用startService()方法,将该Intent 对象传递给它,以启动Service。
3. 绑定Service除了启动Service之外,我们还可以通过绑定Service的方式来获取其实例。
绑定Service可以提供更多的交互方式,并且可以获取Service的实例。
首先,我们需要创建一个ServiceConnection对象,并在其中重写onServiceConnected()和onServiceDisconnected()方法,用于处理Service与应用程序之间的连接和断开连接的事件。
Android中bindService的使用及Service生命周期Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context 的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。
bindService启动服务的特点相比于用startService启动的Service,bindService启动的服务具有如下特点:1. bindService启动的服务在调用者和服务之间是典型的client-server的接口,即调用者是客户端,service是服务端,service就一个,但是连接绑定到service上面的客户端client可以是一个或多个。
这里特别要说明的是,这里所提到的client指的是组件,比如某个Activity。
2. 客户端client(即调用bindService的一方,比如某个Activity)可以通过IBinder接口获取Service的实例,从而可以实现在client端直接调用Service中的方法以实现灵活的交互,并且可借助IBinder实现跨进程的client-server的交互,这在纯startService启动的Service中是无法实现的。
3. 不同于startService启动的服务默认无限期执行(可以通过Context的stopService或Service 的stopSelf方法停止运行),bindService启动的服务的生命周期与其绑定的client息息相关。
当client销毁的时候,client会自动与Service解除绑定,当然client也可以通过明确调用Context的unbindService方法与Service解除绑定。
当没有任何client与Service绑定的时候,Service会自行销毁(通过startService启动的除外)。
开始介绍之前,先看一下本例的界面:Android远程Service调用简介:远程Service调用,是Android系统为了提供进程间通信而提供的轻量级实现方式,这种方式采用一种称为远程进程调用技术来实现,英文名全称是Remote Procedure Call,即RPC。
RPC简介:远程进程调用是指在一个进程里,调用另外一个进程里的服务。
Android通过接口定义语言来生成两个进程间的访问代码。
接口定义语言(Android Interface Definition Language,即AIDL)是Android系统的一种接口描述语言,Android编译器可以将AIDL文件编译成一段JA V A代码,生成相对的接口。
下面来详细介绍下如何通过RPC机制来达到远程进程调用的目的和步骤。
第一,我们要先弄清楚这是怎么样的一个流程。
用通俗点语言来说,打个例子:比如公司A提供A服务,并且这种服务是对外开放的,也就是其他公司或者个人都可以通过某种方式来使用这种服务,公司B想要使用A公司的A服务,就以通过公司A编制的一种形式来使用它。
用图来表示就是:公司B通过公司A的某种形式来使用公司A提供的服务A现在,我们可以说,进程B可以通过进程A提供的某种形式来使用进程A的服务A。
这个过程就是RPC。
了解基本概念之后,我们可以开始进行RPC的实现步骤。
下面我们分点来说明实现RPC 的步骤。
第一、创建AIDL文件。
这个文件和普通的JA V A文件差不多,只不过后缀名是.aidl。
这个文件相当于一个接口,里面要声明一些你想对外提供服务的方法,也就是你要对外暴露的方法。
注意,这个文件里,除了JA V A基本类型和String,List,Map和Charquene类型不需要引入相应的包外,其他的都要引入包。
例如我们创建一个IPerson.aidl文件,里面只声明了一个方法display():package com.test.service;interface IPersonaidl {String display();//该接口里面所有的方法都应该是你想对外暴露的}第二、创建完AIDL文件后,刷新项目,会发现在gen目录对应的目录下会生成一个IPerson.java接口文件,打开该文件,会发现你在aidl文件里面定义的display()方法,不过没有实现。
调用service服务方法调用service服务•介绍•方法一:直接调用•方法二:使用Intent启动Service•方法三:使用Messenger进行进程间通信•方法四:使用AIDL实现跨进程通信•总结介绍在Android开发中,我们常常需要使用service服务来完成一些后台任务。
调用service服务可以让我们的应用变得更加强大和灵活。
本文将介绍几种常用的调用service服务的方法。
方法一:直接调用最简单的调用service服务的方法是直接调用其提供的方法。
首先,我们需要在文件中声明service组件,然后通过()方法来启动服务。
接下来,我们可以通过获取service实例来直接调用其方法。
// 启动serviceIntent intent = new Intent(context, );(intent);// 获取service实例并调用其方法MyService service = new MyService();();方法二:使用Intent启动Service除了直接调用service,我们还可以通过使用Intent来启动service。
这种方法更加灵活,可以方便地传递数据给service。
// 启动service并传递数据Intent intent = new Intent(context, );("key", value);(intent);在service的onStartCommand()方法中,我们可以通过Intent 获取传递的数据。
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if(intent != null) {String value = ("key");// 处理传递的数据}// 其他逻辑...}方法三:使用Messenger进行进程间通信有时候我们需要在不同的进程间进行通信,可以使用Messenger 实现。
一、Service:(一)、Service 简介:1、何谓“Service”?“Service” 意思即“服务”的意思,像Windows 上面的服务一样,服务是在后台上运行,承担着静悄悄的不为人所注意的工作。
Service运行在后台,它是不可见的、无界面的程序。
Service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity,这个时候程序要在后台继续播放;比如检测SD卡上文件的变化;再或者在后台记录用户的地理信息位置的改变;或者启动一个服务来运行并一直监听某种动作等等。
2、Service概念的总结:∙Service在后台运行,不可以与用户直接交互;∙一个服务不是一个单独的进程。
服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中;∙一个服务不是一个单独的线程。
Service和其他组件一样,默认情况下,Service中的所有代码都是运行在主线程中;∙Service存在的价值虽然不如Activity那么清晰。
但是一般都让Service 执行耗时较长的操作。
例如:播放音乐、下载文件、上传文件等等。
但是因为Service默认运行在主线程中,因此不能直接用它来做耗时的请求或者动作,最好在Service中启动新线程来运行耗时的任务;∙需要通过某一个Activity或其他Context对象来启动Service。
context.startService() 或context.bindService();∙Service很大程度上充当了应用程序后台线程管理器的角色。
(如果Activity中新开启一个线程,当该Acitivyt关闭后,该线程依然在工作,但是与开启它的Activity失去联系。
也就是说此时的这个线程处于失去管理的状态。
但是使用Service,则可以对后台运行的线程有效地管理。
)3、为什么不使用后台线程而使用Service?∙1、Service可以放在独立的进程中,所以更安全;∙2、使用Service可以依赖现有的binder机制,不需要在应用层面上处理线程同步的繁杂工作;∙3、系统可以重新启动异常死去的Service。
4、Service 与Activity 的相同点与不同点:∙不同点:Activity是与用户交互的组件,即可以看到UI界面,而Service 是在后台运行、无需界面;∙相同点:使用Activity 时我们需要在配置文件中声明<activity>标签,同样的使用Service 也需要在配置文件中声明<service>标签。
都具有一定的生命周期。
(二)、服务的分类:1、本地服务Local Service:Local Service 用于应用程序内部。
用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
启动service有两种方法:1)、Context.startService()调用者与服务之间没有关联,即使调用者退出,服务仍可运行2)、Context.bindService()调用者与服务绑定在一起,调用者一旦退出,服务也就终止A、根据启动方式将本地服务分为:启动服务Started Service和绑定服务Bound Service。
【重点】∙Started Service:被启动的服务∙o被启动的服务是由其它组件调用startService()方法而启动的,该方法会导致被启动服务的生命周期方法onStartCommand()被回调。
当服务是被启动状态后,其生命周期与启动它的组件无关,即使启动服务的组件(Activity,BroadcastReceiver)已经被销毁,该服务还可以在后台无限期运行。
除非调用stopSelf()或stopService()来停止该服务。
∙Bound Service:被绑定的服务∙o绑定服务是允许其它应用程序绑定并且与之交互的Service的实现类。
为了提供绑定,必须实现onBind()回调方法。
该方法返回IBinder对象,它定义了服务类与Activity交互的程序接口。
o Activity通过bindService()方法绑定到服务类,同时Activity 必须提供ServiceConnection接口的实现类,它监视Activity与服务类之间的连接。
在重写ServiceConnection接口的onServiceConnected()方法时,实现了将服务类顺利赋值到了Activity中,实现了在Activity中使用该服务类并执行其中的方法。
B、根据onStartCommand()回调方法的返回值,将Service分为粘性Service和非粘性Service:onStartCommand()方法有三种返回值:∙START_STICKY(常量值:1):sticky的意思是“粘性的”。
使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。
当再次启动服务时,传入的第一个参数将为null;∙START_NOT_STICKY(常量值:2):“非粘性的”。
使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
∙START_REDELIVER_INTENT(常量值:3):重传Intent。
使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
【备注:】以上三种情况,可以理解为发生车祸后的人:∙START_STICKY:(常量值:1)车祸后自己苏醒,但是失忆;∙START_NOT_STICKY:(常量值:2)车祸后再也没有苏醒;∙START_REDELIVER_INTENT:(常量值:3)车祸后自己苏醒,依然保持记忆。
2、远程服务Remote Service:Remote Service 用于android系统内部的应用程序之间。
可以定义接口并把接口暴露出来,以便其他应用进行操作。
可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。
(三)、Service的生命周期:1、Started Service的生命周期:∙onCreate():创建服务∙onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)∙onDestroy() :服务被停止【详细说明:】∙在程序中调用:context.startService() 会触发执行Service生命周期中的onCreate()、onStartCommand()回调方法,此时服务就开始正式运行;∙如果Service还没有运行,则android先调用onCreate()然后调用onStartCommand();如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次;∙如果在程序中调用:context.stopService()会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;∙stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。
该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()∙所以StartService的生命周期为:onCreate --> onStartCommand(可多次调用) -->onDestroy。
2、Bound Service的生命周期:∙onCreate():创建服务∙onBind():绑定服务,服务开始运行∙onUnbind():取消绑定∙onDestroy() :服务被停止【详细说明:】∙在程序中调用:context.bindService()会触发执行Service生命周期中的onCreate()、onBind()回调方法,此时服务开始运行;∙onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
此后调用者(Context,例如Activity)会和Service绑定在一起;∙如果调用Service的调用者Context退出了,那么会依次调用Service 生命周期中的onUnbind()、onDestroy()回调方法,会让服务停止;∙所以BindService的生命周期为:onCreate -->onBind(只一次,不可多次绑定) -->onUnbind -->onDestory。
【备注:】∙Service是不能自己启动的,只有通过 Context 对象调用startService() 和bindService() 方法来启动。
∙在Service每一次的开启关闭过程中,只有onStartCommand()可被多次调用(通过多次startService调用),其他onCreate()、onBind()、onUnbind()、onDestory()在一个生命周期中只能被调用一次。
∙∙Service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后头的。
二、本地Service:(一)、Started Service启动MediaPlayer播放音乐:1、操作步骤:∙1、写xml布局文件;∙2、写MainActivity文件,通过按钮点击事件启动Service;∙3、写继承于Service的StartService类文件:重写onCreate()/onStartCommand()/onDestroy()回调方法。
2、XML布局文件核心代码:<LinearLayout xmlns:android="/apk/res /android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><Buttonandroid:id="@+id/button_main_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="clickButton"android:text="播放音乐"/><Buttonandroid:id="@+id/button_main_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text="暂停音乐"/><Buttonandroid:id="@+id/button_main_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text="停止音乐"/><Buttonandroid:id="@+id/button_main_exit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text="关闭当前窗体"/><Buttonandroid:id="@+id/button_main_stopservice"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="clickButton"android:text="停止服务"/></LinearLayout>3、MainActivty核心代码:publicclass MainActivity extends Activity { privatestaticfinal String TAG = "MainActivity";private Intent intent = null;@Overrideprotectedvoid onCreate(Bundle savedInstanceState) { Log.i(TAG, "==onCreate执行");super.onCreate(savedInstanceState);setContentView(yout.activity_main);intent = new Intent(this, StartServicePlayMusic.class); }@Overrideprotectedvoid onDestroy() {Log.i("MainActivty", "==onDestroy()");super.onDestroy();if (intent != null) {// 停止服务可以通过stopService(intent)来停止,也可以intent到Service程序中,通过stopSelf()来停止。