欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

ANDROID下的四大组件之服务SERVICE

发布时间:2016-09-05 21:04  回复:0  查看:2220   最后回复:2016-09-05 21:04  

这篇文章主要讲解一些Android service入门基础知识,希望带大家走进Android service的大门。

 

1.什么是服务

服务是Android中为了实现程序后台运行的解决方案,非常适合执行那些不需要和用户交互而且还要求长期运行的程序。服务的运行不依赖任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持正常运行。

 

2.如何定义服务

通常我们会新建一个类,让其继承Service

:

 

public class MyService extends Service{

        public IBinder onBind(Intent intent){

    

        }

 

        public void onCreate(){

 

        }

 

         public int onStartCommand(Intent intnt,int flags,int startId){

             return super.onStartCommand(intente,flags,startId)

         }

 

         public void onDestory(){

            super.onDestory();

         }

}                            

 

onCreate()在服务创建的时候启动,onStratCommand()会在服务启动的时候启动,onDestory()会在服务销毁的时候调用。

 

3.如何启动服务

首先要在AndroidManifest中注册service,如:

<service  name="MyService">

</service>

启动服务需要通过方法startService(Intent),startService(new Intent(this,MyService.class));

停止服务则需要通过方法stopService(Intnet),stopService(new Intent(this,MyService.class));

 

启动服务后会先调用onCreate(),然后再调用onStartCommand()。其中onCreate()在第一次创建service的时候会调用,onStartCommand()每次启动服务的时候都会调用。

 

4.服务如何和活动进行通信

虽然我们通过startService启动了服务,但是这也只是单单的运行服务,没有和活动进行任何联系,所以现在我们要让服务和活动进行通信。

这里让两者联系起来需要用到之前提到过的onBind(),但是我们首先要在继承了Service的类中,创建一个继承了Binder的内部类,该内部类中写上需要活动用到的方法,如查看下载进度的getProgress()和开始下载的startDownload(),为了让活动能获取到该类的实例,我们还需要创建一个实例,onBind()中返回该实例。整体的例子:

 

public class LocalService extends Service {

 

   

    public class DownloadBinder extends Binder{

        public void startDownload(){

             Log.d("MyService","startDownload execute");

        }

         

        public int getProgress(){

            return 0;

        }

    }

     

    public DownloadBinder mBinder=new DownloadBinder();

     

     

    @Override

    public IBinder onBind(Intent intent) {

        // 返回 SimpleBinder 对象

        return mBinder;

    }

 

}

 

 

那么接下来活动如何获取Binder呢?

我们只要在活动中调用onBind(Intnet,serviceConnection,BIND_AUTO_CREATE)就可以让服务和活动绑定在一起,从而让活动调用服务中的方法。

这其中第二个参数serviceConnection需要我们在活动中创建出来,我们需要在活动中创建其匿名类,然后其中有两个方法,一个为onServiceConnected(),另一个为onServiceDisconnected(),

我们需要在onServiceConnected()中通过向下转型获取到服务中的Binder,然后通过Binder调用服务中的方法。

第三个参数是一个标志位,BIND_AUTO_CREATE代表活动和服务在绑定后自动创建服务。

如果需要解绑服务,调用unbindService(serviceConnection);

 

例子

 

ServiceConnection sc = new ServiceConnection() {

             

            @Override

            public void onServiceDisconnected(ComponentName name)          {

 

            }

             

            @Override

            public void onServiceConnected(ComponentName name, IBinder service) {

                MyService.DownloadBinder mBinder = (MyService.DownloadBinder)service;

               

            }

        };

        findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {

             

            @Override

            public void onClick(View v) {

                bindService(new Intent(Main.this,MyService.class), sc, Context.BIND_AUTO_CREATE);

                isBind = true;

            }

        });

        findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {

             

            @Override

            public void onClick(View v) {

                if(isBind){

                    unbindService(sc);

                    isBind = false;

                }

            }

        });

 

 

5.服务的生命周期

只启动的服务:onCreate()→onStartCommand()→onDestory()

如果被startService()多次启动,onCreate()只执行一次,onStart()多次执行,只创建Service的一个实例。

 

只绑定的服务:onCreate()→onBind→onUnbind()→onDestory()

bindService()多次调用,onCreate()只调用一次,除非调用unBindService(),否则Service一直运行。

 

即启动又绑定的服务:onCreate()→onStartCommand()→onBind()→onUnBind()→onDestory()

onCreate()必定只执行一次,startService调用几次则执行几次onStartCommand(),调用unbind不会停止service,必须stopServiceServicestopself()停止服务。

 

 

 

文章来自:博客园/shawdo

您还未登录,请先登录

热门帖子

最新帖子