Android小项目之--服务【Service】

it2022-05-09  29

  有段时间没有写博客了,最近一段时间跳到了深圳,新的公司新的环境要去适应,人挺累的,所以近段时间没有写博客。这几天QQ群上有位朋友在问要Service的例子,当时没有跟他应答,现在抽空把例子整理了一下,发表上博客园,希望他能看得到。

 

  Service 简介

何谓“Service”?“Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,有些服务是在后台上运行,干着静悄悄的勾当不让人知道 。与 Activity 不同,Service 是并不直接与用户交互的运行于后台的一类组件。

 

  Google对Service的解释

一个服务不是一个单独的进程。服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中。一个服务不是一个单独的线程。它是一种手段,本身做着主线的工作 (以避免应用程序没有响应的错误)。

  Service 与 Activity 的相同点与不同点

不同点:Activity是与用户交互的组件,即我们用眼睛可以看到的界面,而Service是在后台运行,执行隐藏的动作。相同点:使用Activity 时我们需要在配置文件中声明<activity>标签,同样的使用Service 也需要在配置文件中声明<service>标签

  使用Service

创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:

onCreate()创建onStart()开始onDestry()释放

注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。但两种方法的Service生命周期是不同的,下面我们通过一个小例子来区别各自的生命周期。

例子效果图如下:

代码如下:

package  com.terry; import  android.app.Service; import  android.content.Intent; import  android.os.IBinder; import  android.util.Log; public   class  ServiceSample  extends  Service {     final  String TAG = " Service " ;    @Override     public  IBinder onBind(Intent intent) {         //  TODO Auto-generated method stub         Log.i(TAG, " onBind " );         return   null ;    }        @Override     public   boolean  onUnbind(Intent intent) {         //  TODO Auto-generated method stub         Log.i(TAG,  " onUnbind " );         return   super .onUnbind(intent);    }    @Override     public   void  onRebind(Intent intent) {         //  TODO Auto-generated method stub           super .onRebind(intent);        Log.i(TAG,  " onRebind " );    }    @Override     public   void  onCreate() {         //  TODO Auto-generated method stub          super .onCreate();        Log.i(TAG,  " onCreate " );    }    @Override     public   void  onDestroy() {         //  TODO Auto-generated method stub          super .onDestroy();        Log.i(TAG,  " onDestroy " );    }        @Override     public   void  onStart(Intent intent,  int  startId) {         //  TODO Auto-generated method stub          super .onStart(intent, startId);        Log.i(TAG,  " onStart " );    }    }

 

当调用startService方法时:

1、若Servcie没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。 2、若Service己经启动则首先会直接调用onStart方法, 3、关闭时使用stopservice来关闭。

当调用bindService方法时:

1、若Service没有启动,则首先调用onCreate方法,来初始化启动Service,然后调用Service的onBind。 2、通过onUnbind和onDestry方法停止Service运行。

下面通过一组图来更详细的说明Service的生命周期

开始服务

停止服务

绑定服务

销毁服务

 

音乐服务DEMO

通过上面的小例子可能有些园友还是很模糊,下面通过一个播放音乐的小例子加深大家对Service 的理解,该例子通过播放一首mp3 ,当用户点击开始“按钮”,音乐开始播放,即时你退出程序音乐也会播放,点击“停止”按钮,停止播放音乐 。

该例子继承service 然后重写onStart播放音乐 重写onDestry停止音乐 ,代码如下:

 

package  com.terry; import  android.app.Service; import  android.content.Intent; import  android.media.MediaPlayer; import  android.os.IBinder; public   class  musicServer  extends   Service {     private  MediaPlayer player;    @Override     public  IBinder onBind(Intent intent) {         //  TODO Auto-generated method stub          return   null ;    }        @Override     public   void  onStart(Intent intent,  int  startId) {         //  TODO Auto-generated method stub          super .onStart(intent, startId);     if (player == null )    {        player = MediaPlayer.create( this , R.raw.start);        player.start();    }    }        @Override     public   void  onDestroy() {         //  TODO Auto-generated method stub          super .onDestroy();        player.stop();    }}

 

完成了service类,我们只要在对应的Activity的事件中调用服务即可实现,代码如下:

  package  com.terry; import  android.app.Activity; import  android.content.Intent; import  android.os.Bundle; import  android.view.View; import  android.view.View.OnClickListener; import  android.widget.Button; public   class  musicActivity   extends  Activity{     private  Intent intent = new  Intent( " com.terry.Android.MUSIC " );         @Override     protected   void  onCreate(Bundle savedInstanceState) {         //  TODO Auto-generated method stub          super .onCreate(savedInstanceState);        setContentView(R.layout.music);        findView();        viewHolder.myButton.setOnClickListener( new  OnClickListener() {                        @Override             public   void  onClick(View v) {                 //  TODO Auto-generated method stub                 startService(intent);            }        });                viewHolder.myButton2.setOnClickListener( new  OnClickListener() {                        @Override             public   void  onClick(View v) {                 //  TODO Auto-generated method stub                 stopService(intent);            }        });    }             void  findView(){        viewHolder.myButton = (Button)findViewById(R.id.play);        viewHolder.myButton2 = (Button)findViewById(R.id.stop);    }}

 

 

运行效果图:

差不多就到这里吧,有点晚了,把源码提供给大家:/Files/TerryBlog/ServiceTestDemo.rar

转载于:https://www.cnblogs.com/TerryBlog/archive/2010/06/25/1764821.html


最新回复(0)