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

一、概述

       我们知道,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     <Button
16         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     <Button
24         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     <View
32         android:layout_width="fill_parent"
33         android:layout_height="70px"
34         />
35 
36     <TextView
37         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 Service
10 {
11     final String TAG = "MyService";
12 
13     MyBinder mMyBinder = new MyBinder();
14 
15     @Override
16     public IBinder onBind(Intent arg0)
17     {
18         // TODO Auto-generated method stub
19         //返回对象给Client
20         return mMyBinder;
21     }
22 
23     @Override
24     public boolean onUnbind(Intent intent)
25     {
26 
27         return true;
28     }
29 
30     @Override
31     public void onCreate()
32     {
33         super.onCreate();
34         Log.v(TAG, "++ onCreate() ++");
35     }
36 
37     @Override
38     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     @Override
46     public void onDestroy()
47     {
48         super.onDestroy();
49         Log.v(TAG, "++ onDestroy() ++");
50     }
51 
52     //自己定义一个继承自Binder的类
53     public class MyBinder extends Binder
54     {
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             @Override
102             //当与Service断开连接后,这个函数自动被调用
103             public void onServiceDisconnected(ComponentName name)
104             {
105                 // TODO Auto-generated method stub
106 
107             }
108 
109         };
110 
111     }
112 
113 }
复制代码

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

 

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

运行该程序:

 

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

 

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

 

点击“停止服务”按钮:

 

完成。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值