分享

一个Android Service小例子

 lifei_szdz 2013-06-14

写过一些android程序,但是android中的Service的组件却不曾用过,因此,对它也不甚了解,所以,今天写个小例子来学习如何使用Service。这其实也是我学习新东西的一个方法,对于陌生的东西,看书只是理论只是的了解,但是实际的情况如何,还是需要写些程序来测试,那样的理解更深刻。

 

测试目的:了解Service的生命周期,以及在startService和bindService时,Service如何响应。

程序界面如下:


 

1、编写Android Service需要基础Service类,并实现其中的onBind方法

 

 

Java代码  收藏代码
  1. /** 
  2.  * Android Service 示例 
  3.  *  
  4.  * @author dev 
  5.  *  
  6.  */  
  7. public class ServiceDemo extends Service {  
  8.     private static final String TAG = "ServiceDemo" ;  
  9.     public static final String ACTION = "com.lql.service.ServiceDemo";  
  10.       
  11.     @Override  
  12.     public IBinder onBind(Intent intent) {  
  13.         Log.v(TAG, "ServiceDemo onBind");  
  14.         return null;  
  15.     }  
  16.       
  17.     @Override  
  18.     public void onCreate() {  
  19.         Log.v(TAG, "ServiceDemo onCreate");  
  20.         super.onCreate();  
  21.     }  
  22.       
  23.     @Override  
  24.     public void onStart(Intent intent, int startId) {  
  25.         Log.v(TAG, "ServiceDemo onStart");  
  26.         super.onStart(intent, startId);  
  27.     }  
  28.       
  29.     @Override  
  30.     public int onStartCommand(Intent intent, int flags, int startId) {  
  31.         Log.v(TAG, "ServiceDemo onStartCommand");  
  32.         return super.onStartCommand(intent, flags, startId);  
  33.     }  
  34. }  
 

 

2、在AndroidManifest.xml文件中声明Service组件:

Xml代码  收藏代码
  1. <service android:name="com.lql.service.ServiceDemo">  
  2.             <intent-filter>  
  3.                 <action android:name="com.lql.service.ServiceDemo"/>  
  4.             </intent-filter>              
  5. </service>  

  其中的intent-filter中定义的action是用来启动服务的Intent。

 

3、在需要service的地方通过Context.startService(Intent)方法启动service或者Context.bindService方法来绑定service。

 

具体测试代码如下:

 

 

Java代码  收藏代码
  1. public class ServiceDemoActivity extends Activity {  
  2.     private static final String TAG = "ServiceDemoActivity";  
  3.       
  4.     Button bindBtn;  
  5.     Button startBtn;  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.           
  11.         bindBtn = (Button)findViewById(R.id.bindBtn);  
  12.         startBtn = (Button)findViewById(R.id.startBtn);  
  13.           
  14.         bindBtn.setOnClickListener(new OnClickListener() {  
  15.             public void onClick(View v) {  
  16.                 bindService(new Intent(ServiceDemo.ACTION), conn, BIND_AUTO_CREATE);  
  17.             }  
  18.         });  
  19.           
  20.         startBtn.setOnClickListener(new OnClickListener() {  
  21.             public void onClick(View v) {  
  22.                 startService(new Intent(ServiceDemo.ACTION));  
  23.             }  
  24.         });  
  25.     }  
  26.       
  27.     ServiceConnection conn = new ServiceConnection() {  
  28.         public void onServiceConnected(ComponentName name, IBinder service) {  
  29.             Log.v(TAG, "onServiceConnected");  
  30.         }  
  31.         public void onServiceDisconnected(ComponentName name) {  
  32.             Log.v(TAG, "onServiceDisconnected");  
  33.         }  
  34.     };  
  35.     @Override  
  36.     protected void onDestroy() {  
  37.         Log.v(TAG, "onDestroy unbindService");  
  38.         unbindService(conn);  
  39.         super.onDestroy();  
  40.     };  
  41. }  
 

 

4、日志输出:


上面的截图是点击绑定服务时输出的。可以看出,只调用了onCreate方法和onBind方法,当重复点击绑定服务时,没有再输出任何日志,并且不报错。onCreate方法是在第一次创建Service时调用的,而且只调用一次。另外,在绑定服务时,给定了参数BIND_AUTO_CREATE,即当服务不存在时,自动创建,如果服务已经启动了或者创建了,那么只会掉调用onBind方法。

 


上面的截图是在多次点击启动服务时输出的。可以看出,在第一次点击时,因为Service还未创建,所以调用了onCreate方法,紧接着调用了onStartCommand和onStart方法。当再次点击启动服务时,仍然调用了onStartCommand和onStart方法,所以,在Service中做任务处理时需要注意这点,因为一个Service可以被重复启动。

 

这里说一下,平常使用多的是startService方法,可以把一些耗时的任务放到后台去处理,当处理完成后,可以通过广播来通知前台。

而onBind方法更多的是结合AIDL来使用,这样一个应用可以通过绑定服务获得的IBinder来拿到后台的接口,进而调用AIDL中定义的方法,进行数据交换等。

 

后面将来学习AIDL!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多