版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android开发实战经典第9章:Android组件通信 Service北京魔乐科技软件学院李兴华研发部本章目标掌握Service与Activity的区别;掌握Service的定义及使用;可以使用ServiceConnection 接口绑定一个Service;了解系统提供的Service程序。E-MAIL:认识Service在Android系统开发之中,Services是一个重要的组成部分。如果现在某些程序需要中的部分操作是很消耗时间的,那么可以将这些程序定义在Service之中,这样就可以完成程序的运行(也可以在不显示界面的形式下运行),即:Services实际上就
2、相当于是一个没有图形界面的Activity程序,而且当用户要执行某些操作需要进行跨进程访问的时候也可以使用Service来完成。E-MAIL:Service的基本组成Service是一个没有UI界面的操作组件,主要的功能是为Activity程序提供一些必要的支持,例如:手机中的Mp3播放软件,当回到桌面上的时候这些组件依然可以运行,实际上这些就属于Service的功能,在开发时用户只需要继承自android.app.Service类就可以完成Service程序的开发,在Service之中也有自己的生命周期方法。E-MAIL:Service的生
3、命周期控制方法E-MAIL:No.方法及常量类型描述1public static final int START_CONTINUATION_MASK常量继续执行Service2public static final int START_STICKY常量用于显式的启动和停止Service3public abstract IBinder onBind(Intent intent)普通设置Activity和Service之间的绑定4public void onCreate()普通当一个Service创建时调用5public int onStartCommand(Intent
4、 intent, int flags,int startId)普通启动Service,由startService()方法触发6public void onDestroy()普通Service销毁时调用,由stopService()方法触发Activity类中操作Service的方法E-MAIL:No.方法类型描述1public ComponentName startService(Intentservice)普通启动一个Service2public boolean stopService(Intent name)普通停止一个Service3public boolean
5、 bindService(Intent service, ServiceConnection conn, int flags)普通与一个Service绑定4public void unbindService(ServiceConnectionconn)普通取消与一个Service的绑定范例:定义服务E-MAIL:范例:定义用户的Service组件 MyServiceUtil.javaE-MAIL:package org.lxh.demo;import android.app.Service; import android.content.In
6、tent; import android.os.IBinder;public class MyServiceUtil extends Service / 必须继承ServiceOverridepublic IBinder onBind(Intent intent) / 绑定Activityreturn null;Overridepublic void onCreate() / 创建时调用System.out.println(* Service onCreate();Overridepublic void onDestroy() / 销毁时调用System.out.println(* Servi
7、ce onDestroy();Overridepublic int onStartCommand(Intent intent, int flags, int startId) / 开始Service System.out.println(* Service onStart() - Intent = + intent+ , startId = + startId);return Service.START_CONTINUATION_MASK ;/ 继续执行Service范例:定义布局管理器E-MAIL:布局管理器的高度为屏幕高度默认显示文字默认显示文字范例:定义Acti
8、vity程序,操作ServiceE-MAIL:public class MyServiceDemo extends Activity private Button start;/ 定义按钮private Button stop;/ 定义按钮Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);super.setContentView(R.layout.main);/ 调用布局文件this.start = (Button) super.find
9、ViewById(R.id.start);/ 取得组件this.stop = (Button) super.findViewById(R.id.stop);/ 取得组件this.start.setOnClickListener(new StartOnClickListenerImpl() ;/ 单击this.stop.setOnClickListener(new StopOnClickListenerImpl() ;/ 单击private class StartOnClickListenerImpl implements OnClickListener Overridepublic void
10、onClick(View v) MyServiceDemo.this.startService(new Intent(MyServiceDemo.this, MyServiceUtil.class);/ 启动Serviceprivate class StopOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.stopService(new Intent(MyServiceDemo.this, MyServiceUtil.class);/ 停止S
11、ervice配置Service一个Service程序编写完成之后还需要在项目中的AndroidManifest.xml文 件之中进行注册,在节点下添加如下的代码:E-MAIL:绑定Service当一个Service启动之后,如果没有出现意外以及明确的调用stopService()方法的话则将会一直驻留在手机的服务之中,如果现在希望被一个Activity启动的Service可以在Activity程序结束后自动结束,则可以将一个Activity和Service进行绑定,在Activity类中专门提供了一个用于绑定Service的bindService()方法,但是在此方法
12、返回的是一个android.content.ServiceConnection接口的参数E-MAIL:ServiceConnection接口定义的方法E-MAIL:No.方法类型描述1public abstract void onServiceConnected (ComponentName name, IBinder service)普通当与一个Service建立连接的时候调用2public abstract voidonServiceDisconnected(ComponentNamename)普通当与一个Service取消连接的时候调用
13、IBinder接口 ServiceConnection接口主要的功能是当一个Activity程序与Service建立连接之后,可以通过ServiceConnection接口执行Service连接(或取消)连接的处理操作,在Activity连接到Service程序上之后,会触发Service类中的onBind()方法,在此方法中要返回一个android.os.IBinder接口的对象。E-MAIL:IBinder接口的常量和方法E-MAIL:No.常量及方法类型描述1public static final int DUMP_TRANSACTIO
14、N常量IBinder协议的事务码:清除内部状态2public static final int FIRST_CALL_TRANSACTION常量用户指令的第一个事务码可用3public static final int FLAG_ONEWAY常量transact()方法单向调用的标志位,表示调用者不会等待从被调用者那里返回的结果,而立即返回4public static final int INTERFACE_TRANSACTION常量IBinder协议的事务码:向事务接收端询问其完整的接口规范5public static final int LAST_CALL_TRANSACTION常量用户指
15、令的最后一个事务码可用6public static final int PING_TRANSACTION常量IBinder协议的事务码:pingBinder()7public abstract void dump(FileDescriptor fd, String args)方法向指定的数据流输出对象状态8public abstract String getInterfaceDescriptor()方法取得被Binder对象所支持的接口名称9public abstract boolean isBinderAlive()方法检查Binder所在的进程是否活着10public abstract v
16、oid linkToDeath(IBinder.DeathRecipient recipient, intflags)方法如果指定的Binder消失,则为注册一个新的11public abstract boolean pingBinder()方法检查远程对象是否存在12public abstract IInterface queryLocalInterface(String descriptor)方法取得对一个接口绑定对象本地实现13public abstract boolean transact(int code, Parcel data, Parcel reply, intflags)方法
17、执行一个一般的操作14public abstract boolean unlinkToDeath(IBinder.DeathRecipientrecipient, int flags)方法删除一个接收的范例:定义Service类 MyService.javaE-MAIL:public class MyServiceUtil extends Service / 必须继承Serviceprivate IBinder myBinder = new Binder() Overridepublic String getInterfaceDescriptor() / 取得接口描述
18、信息return MyService class.;/ 返回Service类的名称 ;Overridepublic IBinder onBind(Intent intent) / 绑定时触发System.out.println(* Service onBind() Intent = + intent) ;return myBinder; Overridepublic void onRebind(Intent intent) / 重新绑定时触发System.out.println(* Service onRebind() Intent = + intent);super.onRebind(int
19、ent); Overridepublic boolean onUnbind(Intent intent) / 解除绑定时触发System.out.println(* Service onUnbind() Intent = + intent);return super.onUnbind(intent); Overridepublic void onCreate() / 创建时触发System.out.println(* Service onCreate();super.onCreate(); Overridepublic void onDestroy() / 销毁时触发System.out.pr
20、intln(* Service onDestroy();super.onDestroy();Overridepublic int onStartCommand(Intent intent, int flags, int startId) / 启动时触发System.out.println(* Service onStartCommand() Intent = + intent);return Service.START_CONTINUATION_MASK;范例:定义布局管理器 main.xmlE-MAIL:布局管理器的高度为屏幕高度默认显示文字默认显示文字默认显示文字
21、默认显示文字范例:定义Activity程序,操作Service(A)E-MAIL:package org.lxh.demo;import android.app.Activity;import android.content.ComponentName; import android.content.Context; import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;impor
22、t android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MyServiceDemo extends Activity private Button start;/ 定义按钮private Button stop;/ 定义按钮private Button bind;/ 定义按钮private Button unbind;/ 定义按钮private ServiceConnection
23、 serviceConnection = new ServiceConnection() Overridepublic void onServiceConnected(ComponentName name,IBinder service) / 连接到Servicetry System.out.println(# Service Connect Success. service = + service.getInterfaceDescriptor(); catch (RemoteException e) e.printStackTrace();Overridepublic void onServ
24、iceDisconnected(ComponentName name) / 与Service断开连接System.out.println(# Service Connect Failure.);范例:定义Activity程序,操作Service(B)E-MAIL:Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);super.setContentView(R.layout.main);/ 调用布局文件this.start = (Button
25、) super.findViewById(R.id.start);/ 取得组件this.stop = (Button) super.findViewById(R.id.stop);/ 取得组件this.bind = (Button) super.findViewById(R.id.bind);/ 取得组件this.unbind = (Button) super.findViewById(R.id.unbind); / 取得组件this.start.setOnClickListener(new StartOnClickListenerImpl() ;/ 单击this.stop.setOnClic
26、kListener(new StopOnClickListenerImpl() ;/ 单击this.bind.setOnClickListener(new BindOnClickListenerImpl() ;/ 单击this.unbind.setOnClickListener(new UnbindOnClickListenerImpl() ;/ 单击private class StartOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.st
27、artService(new Intent(MyServiceDemo.this, MyServiceUtil.class);/ 启动Serviceprivate class StopOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.stopService(new Intent(MyServiceDemo.this, MyServiceUtil.class);/ 停止Service范例:定义Activity程序,操作Service(C)E-M
28、AIL:private class BindOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.bindService(new Intent(MyServiceDemo.this,MyServiceUtil.class), MyServiceDemo.this.serviceConnection, Context.BIND_AUTO_CREATE); / 绑定Servicprivate class UnbindOnCl
29、ickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.unbindService(MyServiceDemo.this.serviceConnection);/ 取消Service绑定范例:解决but如果现在没有服务与Activity进行绑定而又调用了解除绑定操作,则会出现错误,所以在解除绑定之前必须要增加一个判断,即:判断一个Activity是否和一个Service绑定在了一起,如果绑定在了一起才可以使用unbindService()方法解除绑定。一般
30、的做法是定义一个标记性的操作接口,而后在Activity中判断此接口对象是否为null来决定是否绑定了Service,这样说比较抽象,下面通过一个实际的代码来观察,本程序为了方便,只提供了绑定服务与解除绑定两个操作。E-MAIL:范例:定义布局管理器 main.xmlE-MAIL:布局管理器的高度为屏幕高度默认显示文字默认显示文字范例:定义标记性接口 IServiceE-MAIL:package org.lxh.demo;public interface IService 范例:定义服务类 MyServiceUtil
31、E-MAIL:package org.lxh.demo;import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder;public class MyServiceUtil extends Service / 必须继承Serviceprivate IBinder myBinder = new BinderImpl() ; / 定义IBinder Overridepublic IBinder onBind(Inte
32、nt intent) / 绑定时触发System.out.println(* Service onBind() Intent = + intent) ;return myBinder;class BinderImpl extends Binder implements IService Overridepublic String getInterfaceDescriptor() / 取得接口描述信息return MyService class.;/ 返回Service类的名称范例:定义Activity程序,绑定服务(A)E-MAIL:package org.lxh.d
33、emo;import org.lxh.demo.MyServiceUtil.BinderImpl;import android.app.Activity;import android.content.ComponentName; import android.content.Context; import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle; import android.os.IBinder; import android.view.View;impo
34、rt android.view.View.OnClickListener;import android.widget.Button;public class MyServiceDemo extends Activity private Button bind;/ 定义按钮private Button unbind;/ 定义按钮private ServiceConnection serviceConnection = new ServiceConnectionImpl();private IService service = null ;Overridepublic void onCreate(
35、Bundle savedInstanceState) super.onCreate(savedInstanceState); super.setContentView(R.layout.main);/ 调用布局文件this.bind = (Button) super.findViewById(R.id.bind);/ 取得组件this.unbind = (Button) super.findViewById(R.id.unbind); / 取得组件this.bind.setOnClickListener(new BindOnClickListenerImpl() ;/ 单击this.unbin
36、d.setOnClickListener(new UnbindOnClickListenerImpl() ;/ 单击private class BindOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) MyServiceDemo.this.bindService(new Intent(MyServiceDemo.this,MyServiceUtil.class), MyServiceDemo.this.serviceConnection, Context.BIND_AUTO_CR
37、EATE); / 绑定Service范例:定义Activity程序,绑定服务(B)E-MAIL:private class UnbindOnClickListenerImpl implements OnClickListener Overridepublic void onClick(View v) if(MyServiceDemo.this.service != null)MyServiceDemo.this.unbindService(MyServiceDemo.this.serviceConnection); MyServiceDemo.this.service
38、 = null ;/ 清空标记private class ServiceConnectionImpl implements ServiceConnection Overridepublic void onServiceConnected(ComponentName name, IBinder service) / 连接到ServiceMyServiceDemo.this.service = (BinderImpl)service ;/ 取得IService接口对象Overridepublic void onServiceDisconnected(ComponentName name) / 与S
39、ervice断开连接Context类中定义的系统服务E-MAIL:No.常量类型描述1public static final String CLIPBOARD_SERVICE常量剪贴板服务2public static final String WINDOW_SERVICE常量窗口服务3public static final String ALARM_SERVICE常量闹铃服务4public static final String AUDIO_SERVICE常量音频服务5public static final String NOTIFICATION_SERVICE常量N
40、otification服务6public static final String SEARCH_SERVICE常量搜索服务7public static final String POWER_SERVICE常量电源管理服务8public static final String WIFI_SERVICE常量WIFI服务9public static final String ACTIVITY_SERVICE常量运行程序服务范例:剪贴板服务E-MAIL:范例:定义布局管理器 main.xmlE-MAIL:布局管理器的高度为屏幕高度组件高度为文字高度范
41、例:定义Activity程序,操作剪贴板E-MAIL:package org.lxh.demo;import android.app.Activity; import android.content.Context; import android.os.Bundle;import android.text.ClipboardManager;public class MyClipboardDemo extends Activity Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate
42、(savedInstanceState); super.setContentView(R.layout.main);/ 设置布局管理器ClipboardManager clipboardManager = (ClipboardManager)super.getSystemService(Context.CLIPBOARD_SERVICE);/ 取得剪贴板clipboardManager.setText(北京魔乐科技软件学院(MLDN));/ 设置剪贴板中的内容范例:取得正在运行的Activity程序信息E-MAIL:ActivityManagerAndroid手机由于
43、采用了多任务的设计,所以可以同时运行多个Activity程序,而用户如果要想取得这些Activity程序的信息,就可以通过“ACTIVITY_SERVICE”服务取得所有运行的程序,但是此时通过super.getSystemService()方法取得的服务对象的类型为“android.app.ActivityManager”。E-MAIL:ActivityManager类的常用方法E-MAIL:No.方法类型描述1publicList getRunningAppProcesses()普通取得所有的正在运行的进程信息2public List getRunningServices(int maxNum)普通取得指定个数的服务信息3public List getRunningTasks(int maxNum)普通取得指定个数的任务信息4public void killBackgroundProcesses (StringpackageName)普通销毁一个进程,必须设置“KILL_BACKGROUND_PROCE SSES”权限5public ConfigurationInfo getDeviceConfigurati
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糖尿病低血糖昏迷应急演练方案
- 化工厂员工中暑处置流程手册
- 矿山重大安全隐患专项评估报告
- 2026二手车出口认证体系与海外渠道建设策略分析
- 物流行业客服服务响应与问题解决能力绩效分析表
- 传媒公关策划实施评估表
- 客户满意度调查通知函6篇范文-1
- 2026年合作伙伴业绩总结报告邀请函4篇范本
- 2025年秋季学期古代汉语期末考试试卷:古代汉语语法错误分析与纠正
- 交通运输行业车辆调度员物流调度与执行绩效评估表
- 2026年广东省环保集团有限公司人员招聘考试模拟试题及答案
- 2026年全国高校辅导员素质能力大赛考试测试题(附答案)
- 2026-2027北京初中语文秋季期七年级上册期中模拟试卷(三)
- 2026年《检验检测机构资质认定评审准则》考试练习题及答案
- 专项债项目运营管理指南
- 2026新能源领域薄膜过滤材料应用场景开发与商业模式探索报告
- 《小小演奏家 赛龙夺锦》课件2026-2027学年人教版五年级上册音乐
- 《第2课 有趣的平面空间》教学设计-2026-2027学年五年级美术上册岭美版
- 乌鲁木齐辅警考试仿真试题及答案解析
- 高级经济师房地产与建筑经济真题及答案
- 2026年山东省聊城市辅警协警笔试练习题(含答案)
评论
0/150
提交评论