Android应用开发基础篇(6)-----Service

来源:互联网 发布:数据库删除表语句 编辑:程序博客网 时间:2024/06/05 19:54

一、概述

       我们知道,Service是Android的四大组件之一。在我看来,Service可以理解为一种在后台运行的服务,但它不是运行在一个独立的线程中,而是运行在主线程里,当程序有比较“繁重”的任务要执行时,就可以把它放在Service中执行。Service也有自己的生命周期,与Activity有点类似,但它没有用户界面,只在后台运行。

 

二、要求

       编写一个带有Service的程序,在程序中,用户可以启动和停止该服务,可以实现与Service之间的通信。

 

三、实现

     新建工程MyService,修改/res/layout/main.xml文件,在里面添加3个Button按钮和1个TextView文本,完整的main.xml文件如下:

 

复制代码
 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="vertical" > 6  7     <Button 8         android:id="@+id/button" 9         android:layout_width="fill_parent"10         android:layout_height="wrap_content"11         android:text="启动服务"12         android:textSize="15px"13         />14 15     <Button16         android:id="@+id/sbutton"17         android:layout_width="fill_parent"18         android:layout_height="wrap_content"19         android:text="停止服务"20         android:textSize="15px"21         />22 23     <Button24         android:id="@+id/gbutton"25         android:layout_width="fill_parent"26         android:layout_height="wrap_content"27         android:text="获取服务信息"28         android:textSize="15px"29         />30 31     <View32         android:layout_width="fill_parent"33         android:layout_height="70px"34         />35 36     <TextView37         android:id="@+id/mtextview"38         android:layout_width="fill_parent"39         android:layout_height="wrap_content"40         android:gravity="center_horizontal"41         android:textSize="20px"42         android:textColor="#0000FF"43         />44 45 </LinearLayout>
复制代码

新建MyService.java文件,编写一个继承自Service的MyService类,在该类中编写一个继承自Binder的MyBinder类,用来与Client之间的通信,在MyBinder类中编写一个reTurnService()方法,用来返回信息给Client,完整的

MyService.java文件如下:

 

复制代码
 1 package com.nan.service; 2  3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Binder; 6 import android.os.IBinder; 7 import android.util.Log; 8  9 public class MyService extends Service10 {11     final String TAG = "MyService";12 13     MyBinder mMyBinder = new MyBinder();14 15     @Override16     public IBinder onBind(Intent arg0)17     {18         // TODO Auto-generated method stub19         //返回对象给Client20         return mMyBinder;21     }22 23     @Override24     public boolean onUnbind(Intent intent)25     {26 27         return true;28     }29 30     @Override31     public void onCreate()32     {33         super.onCreate();34         Log.v(TAG, "++ onCreate() ++");35     }36 37     @Override38     public int onStartCommand(Intent intent, int flags, int startId)39     {40         super.onStartCommand(intent, flags, startId);41         Log.v(TAG, "++ onStartCommand() ++");42         return flags;43     }44 45     @Override46     public void onDestroy()47     {48         super.onDestroy();49         Log.v(TAG, "++ onDestroy() ++");50     }51 52     //自己定义一个继承自Binder的类53     public class MyBinder extends Binder54     {55         //返回Service中的信息56         public String reTurnService()57         {58             return "This String is from Servive!";59         }60     }61 62 }
复制代码

接着,修改MyServiceActivity.java文件,定义1个MyService.MyBinder对象和1个ServiceConnection对象,实现
ServiceConnection中的onServiceConnected()方法,该方法在bindService()后自动被调用,接收MyService传来的Binder对象。其他内容在程序中有详细注释,完整的MyServiceActivity.java文件如下:

 

复制代码
  1 package com.nan.service;  2   3 import com.nan.service.MyService.MyBinder;  4 import android.app.Activity;  5 import android.content.ComponentName;  6 import android.content.Intent;  7 import android.content.ServiceConnection;  8 import android.os.Bundle;  9 import android.os.IBinder; 10 import android.view.View; 11 import android.widget.Button; 12 import android.widget.TextView; 13  14  15 public class MyServiceActivity extends Activity 16 { 17     private Button mButton = null; 18     private Button sButton = null; 19     private Button gButton = null; 20     private TextView mTextView = null; 21     //定义一个MyBinder对象 22     private MyService.MyBinder mBinder; 23     //定义一个ServiceConnection对象 24     private ServiceConnection mServiceConnection; 25     private Intent mIntent = new Intent(); 26  27     /** Called when the activity is first created. */ 28     @Override 29     public void onCreate(Bundle savedInstanceState) 30     { 31         super.onCreate(savedInstanceState); 32         setContentView(R.layout.main); 33  34         mButton = (Button)findViewById(R.id.button); 35         sButton = (Button)findViewById(R.id.sbutton); 36         gButton = (Button)findViewById(R.id.gbutton); 37         mTextView = (TextView)findViewById(R.id.mtextview); 38  39         //设置按钮动作处理 40         mButton.setOnClickListener(new View.OnClickListener() 41         { 42  43             @Override 44             public void onClick(View v) 45             { 46                 // TODO Auto-generated method stub 47                 //设置要启动Service类 48                 mIntent.setClass(MyServiceActivity.this, MyService.class); 49                 //绑定(建立)这个Service 50                 bindService(mIntent,mServiceConnection,BIND_AUTO_CREATE); 51             } 52         }); 53  54         sButton.setEnabled(false); 55         //设置按钮动作处理 56         sButton.setOnClickListener(new View.OnClickListener() 57         { 58  59             @Override 60             public void onClick(View v) 61             { 62                 // TODO Auto-generated method stub 63                 //取消与Service的连接 64                 unbindService(mServiceConnection); 65                 mButton.setEnabled(true); 66                 sButton.setEnabled(false); 67                 gButton.setEnabled(false); 68             } 69         }); 70  71         gButton.setEnabled(false); 72         //设置按钮动作处理 73         gButton.setOnClickListener(new View.OnClickListener() 74         { 75  76             @Override 77             public void onClick(View v) 78             { 79                 // TODO Auto-generated method stub 80                 //显示从Service传回来的信息 81                 mTextView.setText(mBinder.reTurnService()); 82             } 83         }); 84  85         //与Handler类的使用类似 86         mServiceConnection = new ServiceConnection() 87         { 88  89             @Override 90             //当与Service建立连接后,这个函数自动被调用 91             public void onServiceConnected(ComponentName name, IBinder service) 92             { 93                 // TODO Auto-generated method stub 94                 //获得从Service传来IBinder对象 95                 mBinder = (MyBinder) service; 96                 sButton.setEnabled(true); 97                 mButton.setEnabled(false); 98                 gButton.setEnabled(true); 99             }100 101             @Override102             //当与Service断开连接后,这个函数自动被调用103             public void onServiceDisconnected(ComponentName name)104             {105                 // TODO Auto-generated method stub106 107             }108 109         };110 111     }112 113 }
复制代码

最后,在AndroidManifest.xml文件,在里面添加一个Service声明,如下:

 

<service android:name=".MyService" android:exported="true" />

运行该程序:

 

点击一下“启动服务”按钮:

 

再点击“获取服务信息”按钮,会显示一串字符串,说明已经从Service中获取到了信息:

 

点击“停止服务”按钮:

 

完成。











原创粉丝点击