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

什么是Service?

一、Service

1.Service简介

Service为Android四大组件之一,Service与Activity组件相似,都代表可执行的程序且有自己的生命周期,唯一的区别是Activity组件提供界面方便人机交互而Service只在后台运行且没有交互界面。需要注意的是,Service不是一个单独的进程或为了防止应用出现无反应错误单独的线程,它像其他应用对象一样运行在其托管进程的主线程中。当然,如果我们希望自己的Service能够在后台运行MP3或者网络下载,我们可以创建一个线程来实现。

2.Service的生命周期

由于Service可由两种方式启动:Context.startService()和Context.bindService().

(1)Context.startService()方法:通过该方法启动Service,访问者(客户端)与Service之间没有关联,即使访问者退出了,Service仍然运行。调用Context.startService()触发的Service生命周期方法:

onCreate()->onStartCommand(Intent, int, int) ->Service运行-> Context.stopService()或 stopSelf()->Service被关闭

(2)Context.bindService()方法:通过该方法启动Service,访问者(客户端)与Service绑定在一起,访问者一旦退出,Service也就终止了。调用Context.startService()触发的Service生命周期方法:

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


升华笔记1:

1.当调用Context.bindService()方法启动一个Service时,不会执行onStartCommand(Intent, int, int)方法;

2.当Activity(客户端的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):每次客户端调用startService(Intent)方法启动指定Service时都会被调用,客户端传入的参数:Intent:由startService(Intent)传入的"意图".

public abstract boolean stopService (Intent service):客户端调用该方法关闭Service

public final void stopSelf ():Service自动关闭

public abstract IBinder onBind (Intent intent):该方法是Service子类必须实现的方法,其返回一个IBinder对象,客户端应用程序可通过该对象与Service组件通信。参数Intent对象用于将客户端绑定到Service,传递给Context.bindService。

boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开链接时将会调用该方法

void onDestory():当该Service被关闭之前将会调用该方法,Service将会清理其占有的所有资源(包括所有线程、注册在Service上的接受者)。

二、开发Service基本思路

1.创建、配置Service

(1)定义一个继承于Service的子类,如果希望Service组件完成某些事情,我们只要在onCreate()或onStartCommand()方法中定义相关的业务代码即可。

一个Service组件的框架如下:

\src\service\FirstService.java

public class FirstService extends Service
{
    /*a.必须实现的方法,返回一个IBinder对象给客户端以便实现通信*/
    @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>

升华笔记2:

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);
            //获取程序界面按钮中的start、stop两个按钮
            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()方法。


参考:http://wear.techbrood.com/reference/android/app/Service.html

时间: 2024-10-05 05:10:23

Android学习笔记二十三.Service组件入门(一).什么是Service?的相关文章

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android学习笔记二-Linear Layout

1.LinearLayout是子view均为单方向的,即均为水平或垂直方向的布局.你可以用android:orientation属性来 定义layout方向 所有子view都是一个挨着一个的,所以一个垂直列表,不管它本身多宽,同时只能有一行.若是水平列表,则都等高. 2.LayoutWeight 用来操控各个子view的相对比例,,即各个子元素对空间的使用权重 Weight并非网上很多文章所叙述的那样(文章都过于片面),weight是指某个组件在布局中[剩余空间]中的显示权重,那么所谓的剩余空间

angular学习笔记(二十三)-$http(1)-api

之前说到的$http.get和$http.post,都是基于$http的快捷方式.下面来说说完整的$http: $http(config) $http接受一个json格式的参数config: config的格式如下: { method:字符串 , url:字符串, params:json对象, data:请求数据, headers:请求头, transformRequest:函数,转换post请求的数据的格式, transformResponse:函数,转换响应到的数据的格式, cache:布尔

Android学习笔记(十三)——碎片(一)

碎片 碎片可看作另外一种形式的活动,可以创建碎片来包含视图. 碎片总是嵌入在活动中,一般有两种常见形式: 1.碎片A和碎片B分别处于不同的活动中,当选择碎片A中的某一项时,触发碎片B启动: 2.碎片A和碎片B处于同一个活动中,共享同一活动,以创建更佳的用户体验. 点此下载完整源码~(代码适用于本文章所讲) 1.创建一个名为"Fragments"的项目,在res/layout文件夹下,分别新建fragment1.xml.fragment2.xml:在当前包名下,分别新建Fragment1

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图 ExpandableListView可折叠列表 这一节我们介绍第三个用适配器的控件,ExpandableListView可折叠列表.这个控件可以实现我们在QQ中非常常见好友分组功能,ExpandableListView是ListView的子类,用法跟ListView差不多,下面我们来学习这个控件的基本使用: 常用属性: android:childDivider:指定各组内子类表项之间的分隔条,