链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/20/2360336.html

一、概述

我们知道,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中获取到了信息:

点击“停止服务”按钮:

完成。

Android应用开发基础篇(6)-----Service的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

  3. Android应用开发基础篇(4)-----TabHost(选项卡)

    一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不 ...

  4. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  5. Android应用开发基础篇(12)-----Socket通信(转载)

    转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络 ...

  6. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

  7. Android应用开发基础篇(7)-----BroadcastReceiver

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/22/2363644.html 一.概述 BroadcastReceiver,意思就是广播信息接收 ...

  8. Android应用开发基础篇(2)-----Notification(状态栏通知)

    一.概述      Notification这个部件的功能是在状态栏里显示消息提醒,比如有未读的短信或者是未接的电话,那么状态栏里都会有显示,更或者是从某个应用(比如QQ,酷我音乐等等)里按Home键 ...

  9. Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 一.概述 ScaleGestureDetector这个类是专门用来 ...

随机推荐

  1. QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite

    开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...

  2. 运用JavaScript构建你的第一个Metro式应用程序(on Windows 8)(一)

    原文 http://blog.csdn.net/zhangxin09/article/details/6784547 作者:Chris Sells 译: sp42   原文 包括 HTML.CSS 和 ...

  3. flex4 日期类型字符串转日期类型(string转Date)(转)

    mysql数据库中存储的日期类型通过PHP返回到flex端为字符串类型,这样在flex中进行处理时就必须要将字符串转化为Date类型.如果仅仅是 "年/月/日" 的组合,而没有涉及 ...

  4. VS中C++代码折叠

    用VS编写C#时,可以用#region name和#endregion,将代码分段,这样可以将代码折叠起来,当类过大,方法过长时,这种方法可以提高阅读效率,是人看着更舒服. 对于C/C++语言,#re ...

  5. hdu 4598 Difference(奇圈判定+差分约束)

    这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i   (2) (vi, vj) in E <=& ...

  6. 多个target下编译的时候出错问题的解决

    在工程里如果有多个target的时候,如图 那么编译的时候一定要注意Xcode右侧勾选了正确的target,否则有可能会导致一系列让你想不到的bug. ,另外,如果工程中有framework,那么一定 ...

  7. python 整数和浮点数

    整数和浮点数 Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致. 基本的运算: 1 + 2 + 3 # ==> 6 4 * 5 - 6 # ==> ...

  8. oracle 插入含&字符串

    1.创建表 SQL> create table t(id number,name varchar2(20)); 表已创建. 2.常规方式插入 SQL> insert into t valu ...

  9. Struts学习之文件上传

    * 单文件上传:        * 在动作类action中声明相关属性:            * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型:  ...

  10. MySQL学习系列一---命令行连接mysql和执行sql文件

    1.命令行连接mysql #mysql -h(主机) -u(用户名) -p (数据库名) mysql -hlocalhost -uroot -p testdb Enter password: **** ...