Android笔记二十七.Service组件入门(一).什么是Service?

简介:
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
一、Service
1.Service简单介绍
    Service为Android四大组件之中的一个。Service与Activity组件相似,都代表可执行的程序且有自己的生命周期,唯一的差别是Activity组件提供界面方便人机交互而Service仅仅在后台执行且没有交互界面。Service是android 系统中的一种组件,它们都是从Context派生出来的,可是它不能自己执行,仅仅能在后台执行。而且能够和其它组件进行交互。

它须要通过某一个Activity或者其它Context对象来调用。

须要注意的是,Service不是一个单独的进程或为了防止应用出现无反应错误单独的线程,它像其它应用对象一样执行在其托管进程的主线程中。

当然,假设我们希望自己的Service能够在后台执行MP3或者网络下载,我们能够创建一个线程来实现。

2.Service的生命周期
因为Service可由两种方式启动:Context.startService()和Context.bindService().
(1)Context.startService()方法:通过该方法启动Service,訪问者(client)与Service之间没有关联,即使訪问者退出了,Service仍然执行。

调用Context.startService()触发的Service生命周期方法:

 onCreate()->onStartCommand(Intent, int, int) ->Service执行-> Context.stopService()或 stopSelf()->onDestory()->Service被关闭
(2)Context.bindService()方法:通过该方法启动Service。訪问者(client)与Service绑定在一起,訪问者一旦退出,Service也就终止了。

调用Context.startService()触发的Service生命周期方法:

 onCreate()->OnBind(Intent)->client绑定到Service->OnUnbind()->onDestory()->Service被关闭

升华笔记1:
1.当调用Context.bindService()方法启动一个Service时。不会运行onStartCommand(Intent, int, int)方法;
2.当Activity(client的Activiy)调用BindService()绑定一个已启动的Service(Activity起初通过startService()方法启动)时,系统仅仅是把Service内部IBinder对象(由onBind()方法返回)传递给Acitvity,并不会把该Service生命周期全然"绑定"到该Activity,因而当Activity调用unBindService()方法取消与该Service的绑定时,也仅仅是切断该Activity与Service之间的关联,并不能停止该Service组件。

3.API-Service
public abstract class Service
(1)继承关系
java.lang.Object 
   ↳ android.content.Context
     ↳ android.content.ContextWrapper
       ↳ android.app.Service
(2)构造方法
    Service()
可是。一般我们在开发Service时主要是通过Content.getService()方法来获取Service类对象。
(3)经常用法(Service组件方法)
>void OnCreate():当该Service第一次被创建后将马上被调用。
>public int onStartCommand(Intent intent, int flags, int startId):每次client调用startService(Intent intent)方法启动该Service时都会回调该方法。
>public abstract boolean stopService (Intent service):client调用该方法关闭Service
>public final void stopSelf ():Service自己主动关闭
>public abstract IBinder onBind (Intent intent):该方法是Service子类必须实现的方法,其返回一个IBinder对象,client应用程序可通过该对象与Service组件通信。參数Intent对象用于将client绑定到Service,传递给Context.bindService。
>boolean onUnbind(Intent intent):当该Service上绑定的全部client都断开链接时将会调用该方法
>void onDestory():当该Service被关闭之前将会调用该方法。Service将会清理其占有的全部资源(包含全部线程、注冊在Service上的接受者)。
4.Service的启动方式
(1)Context.startService()启动
    当client(组件)通过Context的startService()启动Service后,訪问者与Service之间没有关联,该Service将一直在后台运行。即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService(),或者Service自己自杀(stopSelf()).在这样的情况下,Service与訪问者之间无法进行通信、数据交换
(2)Context.bindService()启动
    通过Context的bindService()绑定Service后,Servcice就和调用bindService()的组件同生共死了。

也就是说当调用bindService()的组件销毁了,那么它绑定的Service也跟着被结束。

二、开发Service基本思路(本地)
1.创建、配置Service
(1)定义一个继承于Service的子类,假设希望Service组件完毕某些事情,我们仅仅要在onCreate()或onStartCommand()方法中定义相关的业务代码就可以。

一个Service组件的框架例如以下:
\src\service\FirstService.java
public class FirstService extends Service  
{  
    /*a.必须实现的方法,返回一个IBinder对象给client以便实现通信
     *   因为我们调用startService方法启动一个Servie,无需与client(组件)绑定,因此,返回为null.
     */  
    @Override  
    public IBinder onBind(Intent arg0)  
    {  
            return null;  
    }  
    /*b.Service被创建时回调该方法*/  
    @Override  
    public void onCreate()  
    {  
            super.onCreate();  
            System.out.println("Service is Created");  
    }  
    /*c.Service被启动时回调该方法*/  
    @Override  
    public int onStartCommand(Intent intent,int flags,int startId)  
    {  
        Sytem.out.println("Service is Started");  
        return START_STICKY;  
    }  
    /*d.Service被关闭之前回调*/  
    @Override  
    public void onDestroy()  
    {  
          super.onDestroy();  
            System.out.println("Service is Destroyed");    
    }  
}  


2.在AndroidManifest.xml文件里配置该Service
    定义了上面的Service之后,接下来须要在AndroidManifest.xml文件里配置该Service。配置Service使用<service../>元素。

与配置Activity相似的是,配置Service时也可为<service../>元素配置<intent-filter../>子元素。用于说明该Service可被哪些Intent启动

<!--配置一个Service组件-->  
<service  
        android:name=".FirstService">  
        <intent-filter>  
                <!--为该service组件的intent-filter配置action-->  
                  <action android:name="com.example.service.FIRST_SERVICE"/>  
         </intent-filter>  
</service>  
    Action中的值一定要与程序中创建的Intent的Action的值一致,程序就是依据Action的值来查找对应的Service从而启动它。
    Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序。

所以,开发Service类似于开发Activity,我们仅仅需定义一个继承Service的子类而且在AndroidManifest.xml文件里配置该Service后,就能在程序中执行该Serviec。

怎样启动一个Service呢?我们能够在本应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动一个service,也能够在还有一个应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动这个service.


3.启动和停止Service
        当Service开发完毕后,我们能够在自身应用的Activity子类中启动该Service,也能够在其它应用中启动该Service。这里,我们在本应用中启动(关闭)该Service,使用Content.startService(Intent intent)方法。
\src\service\StartService
public class StartServiceTest extends Activity  
{  
    Button start,stop;  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            //获取程序界面button中的start、stop两个button  
            start = (Button) findViewById(R.id.start);  
            stop = (Button) findViewById(R.id.stop);  
            //创建启动Service的Intent  
            final Intent intent = new Intent();  
            //为Intent设置Action属性  
             intent.setAction("com.example.service.FIRST_SERVICE");  
             start.setOnClickListener(new OnClickListener(){  
                        @Override  
                        public void onClick(View arg0)  
                        {  
                                //启动指定Service  
                                startService(intent);  
                        }  
                });  
                stop.setOnClickListener(new OnClickListener(){  
                        @Override  
                        public void onClick(View arg0)  
                        {  
                                //关闭指定Service  
                                stopService(intent);  
                        }  
                });  
    }  
} 
     通过以上3步。我们就算完毕了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分)。


升华笔记3:
1.为Intent设置Action属性。主要作用是指定启动哪个Service。当中。"com.example.service.FIRST_SERVICE"在Service的AndroidManifest.xml配置文件里的<service../>元素的<intent-filter../>子元素中配置该Service的action属性。

2.该Activity通过Content.startService(Intent intent)方法启动指定的Service,每当Service被创建时会回调onCreate方法,每次Service被启动时都会回调onStart方法--多次启动一个已有的Service组件将不会再回调onCreate方法。但每次启动时都会回调onStartCommand()方法。











本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5104681.html,如需转载请自行联系原作者
相关文章
|
6月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
7月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
7月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
216 0
|
5月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
6月前
|
XML 数据库 Android开发
探索Android开发:从入门到精通的旅程
在这篇文章中,我们将一起踏上一段激动人心的旅程,通过深入浅出的方式,解锁Android开发的秘密。无论你是编程新手还是有经验的开发者,本文都将为你提供宝贵的知识和技能,帮助你构建出色的Android应用。我们将从基础概念开始,逐步深入到高级技巧和最佳实践,最终实现从初学者到专家的转变。让我们开始吧!
121 3
|
7月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
98 1
|
7月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
231 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
7月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
6月前
|
XML IDE Java
安卓应用开发入门:从零开始的旅程
【10月更文挑战第23天】本文将带领读者开启一段安卓应用开发的奇妙之旅。我们将从最基础的概念讲起,逐步深入到开发实践,最后通过一个简易的代码示例,展示如何将理论知识转化为实际的应用。无论你是编程新手,还是希望扩展技能的软件工程师,这篇文章都将为你提供有价值的指导和启发。
94 0
|
7月前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
155 0