- 浏览: 402078 次
文章分类
- 全部博客 (327)
- Android (114)
- Java (13)
- Java基础 (14)
- Glib (2)
- linux (15)
- extjs (5)
- eclipse (2)
- Asterisk (56)
- MYSQL (6)
- 数据库 (9)
- PHP (7)
- C# (18)
- 杂谈~~ (1)
- web开发前端 (3)
- 网络编程 (2)
- Opensips (2)
- voip (3)
- debian (7)
- openfire (15)
- wordpress (1)
- 版本控制 (1)
- Android 线程服务广播 (1)
- SRTP (2)
- 单片机及ARM等 (3)
- 基础知识 (5)
- asp.net (2)
- 单片机 (1)
- 设计模式及架构 (1)
- 安全 (1)
- Cubieboard 草莓树莓各类派 Android开发板 (1)
- J2EE (2)
- BootStrap (3)
- BootStrap web前端开发 (1)
- web前端开发 (4)
- object-c (1)
- openwrt (8)
- 智能家居 (4)
- Node.js (4)
最新评论
-
xiaoxiecomeon:
你这个程序一存在线程的时间片相互抢占的问题,运行时间长了很可能 ...
Runnable 和 Thread -
dotjar:
我觉得话应该这么说:引用TestThread tt = new ...
Runnable 和 Thread -
dagf113225:
调用TelephonyManager的隐藏API是先参考Fra ...
Android提高第十四篇之探秘TelephonyManager
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。
为了处理这种后台进程,Android引入了Service的概念。Service在Android中是一种长生命周期的组件,它不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如文件下载程序,它可以在后台执行文件的下载。
让我们来看下如何创建Service:
创建一个Service
Android中已经定义了一个 ‘Service’类,所有其他的Service都继承于该类。Service类中定义了一系列的生命周期相关的方法,如: onCreate(), onStart(), onDestroy()。参见下例:
package com.wissen.testApp.service; public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Toast.makeText(this, “Service created…”, Toast.LENGTH_LONG).show(); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, “Service destroyed…”, Toast.LENGTH_LONG).show(); } }
上例中的这个Service主要做了这些事:当服务创建和销毁时通过界面消息提示用户。
如Android中的其它部件一样, Service也会和一系列Intent关联。Service的运行入口需要在AndroidManifest.xml中进行配置,如下:
之后我们的Service就可以被其他代码所使用了。
使用Service:
应用程序可以通过调用 Context.startService方法来启动Service。如果当前没有指定的Service实例被创建,则该方法会调用 Service的onCreate方法来创建一个实例;否则调用Service的onStart方法。参见下列代码:
.. Intent serviceIntent = new Intent(); serviceIntent.setAction(”com.wissen.testApp.service.MY_SERVICE”); startService(serviceIntent); ..
以上代码调用了startService方法,Service会持续运行,直到调用stopService()或stopSelf()方法。
还有另一种绑定Service的方式:
… ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(”INFO”, “Service bound “); } @Override public void onServiceDisconnected(ComponentName arg0) { Log.i(”INFO”, “Service Unbound “); } }; bindService(new Intent(”com.wissen.testApp.service.MY_SERVICE”), conn, Context.BIND_AUTO_CREATE); …
当应用程序绑定一个Service后,该应用程序和Service之间就能进行互相通信,通常,这种通信的完成依靠于我们定义的一些接口,请看下例:
package com.wissen.testApp; public interface IMyService { public int getStatusCode(); }
这里定义了一个方法来获取Service的状态,但是Service是如何来使它起作用的呢?之前我们看到Service中有个返回IBinder对象的onBind方法,这个方法会在Service被绑定到其他程序上时被调用,而这个IBinder对象和之前看到的onServiceConnected方法中传入的那个IBinder是同一个东西。应用和Service间就依靠这个IBinder对象进行通信:
public class MyService extends Service { private int statusCode; private MyServiceBinder myServiceBinder = new MyServiceBinder(); @Override public IBinder onBind(Intent intent) { return myServiceBinder; } public class MyServiceBinder extends Binder implements IMyService { public int getStatusCode() { return statusCode; } } … }
下列代码是说明getStatusCode是如何被调用的:
ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyService myService = (IMyService) service; statusCode = myService.getStatusCode(); Log.i(”INFO”, “Service bound “); } … };
或者,你也可以通过使用ServiceListener接口来达成相同的目的。
与远程Service通信(进程间Service通信):
如何两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件,内容如下:
package com.wissen.testApp; interface IMyRemoteService { int getStatusCode(); }
如果你正在使用eclipse的 Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:
package com.wissen.testApp; class RemoteService implements Service { int statusCode; @Override public IBinder onBind(Intent arg0) { return myRemoteServiceStub; } private IMyRemoteService.Stub myRemoteServiceStub = new IMyRemoteService.Stub() { public int getStatusCode() throws RemoteException { return 0; } }; … }
当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
… ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyRemoteService myRemoteService = IMyRemoteService.Stub.asInterface(service); try { statusCode = myRemoteService.getStatusCode(); } catch(RemoteException e) { // handle exception } Log.i(”INFO”, “Service bound “); } … };
权限:
我们可以在AndroidManifest.xml文件中使用标签来指定Service访问的权限:
之后应用程序要访问该Service的话就需要使用标签来指定相应的权限:
发表评论
-
直接拿来用!最火的Android开源项目整理
2015-09-16 10:13 584一、代码库 1、from 代码家 整理比较好的源 ... -
探讨android更新UI的几种方法
2014-06-09 23:27 599今天讲的内容非常简单,只是讲讲有关于android界面更新的 ... -
Android 滑动切换页面 以及屏幕手势
2014-05-08 17:49 500手机进入智能机时代,触摸屏也已成为主流之势,原来的手机按键也 ... -
android 用Achartengine 作图
2014-05-08 16:55 733Achartengine 是google的一 ... -
Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
2014-05-08 16:28 736Animation的4个基本动画效果 What is An ... -
java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.Vie
2014-05-06 14:43 2888Android错误:Caused by: java.lang ... -
Android Socket通信如何设置超时时间
2014-05-06 14:14 1039其实关于这个问题可能用到的人不会很多,不过我在这里还是说说。 ... -
【转】Android本地语音识别引擎PocketSphinx-语言建模
2014-02-13 10:35 1793Android本地语音识别引擎PocketSphinx- ... -
关于build.prop原始Dalvik虚拟机设定与调整
2013-09-05 10:40 1247原厂S3 台版 1GB Ramsystem/build.pro ... -
Android中Service与IntentService的使用比较
2013-09-04 15:24 1179该博客来自网络——— ... -
android 应用程序Activity之间数据传递与共享的几种途径
2013-08-01 17:24 8941.基于消息的通信机制 Intent ---boud ... -
android数据通信方式
2013-08-01 17:15 893http://www.itkee.com/develope ... -
“android.intent.category.DEFAULT”的目的是什么?
2013-07-31 16:43 5231、要弄清楚这个问题,首先需要弄明白什么是implicit( ... -
集成拨号盘,2句话的事情
2013-07-30 15:45 588<intent-filter> < ... -
Android TabHost动态加载内容总结
2013-07-25 17:49 940前面用继承TabActivity的方法很好的完成了,TabHo ... -
[Android实例] android json
2013-07-17 15:20 639import java.io.ByteArrayOutput ... -
android json解析及简单例子
2013-07-17 15:19 916JSON的定义: 一种轻量级的数据交换 ... -
AsyncTask的用法-UI刷新发放
2013-07-15 14:50 653在开发Android应用时必须遵守单线程模型的原则: A ... -
java.lang.OutOfMemoryError处理错误
2013-07-15 14:41 650java.lang.OutOfMemoryError异常解决 ... -
关于android.view.WindowLeaked异常的解决方案
2013-07-15 10:34 598Android.view.WindowLeaked按字面了解, ...
相关推荐
这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
NULL 博文链接:https://hbxflihua.iteye.com/blog/1544184
疯狂android资料:第十章Service与BroadcaseReceiver.doc
博文android基础知识05:四大组件之service 02:远程调用中关于远程调用service的实例程序
android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。 总体来说它的主要作用是:是否支持其它应用调用当前组件。 例如: <activity nandroid:exported=...
这是Pro Android学习系列中http service的例子源代码。
在Qt项目中启动一个监听SD卡插入的Android服务,并通过jni在该服务中发射Qt信号,另外在Qt中通过信号与槽机制成功获取该服务发射的信号。
android service 简单实例代码 . binder继承一个接口,实现方法。
Android程序技术:Service.pptx
Android安全开发基础: 四大组件之服务 (Service) Android安全开发基础: 四大组件之广播(Broadcast Receiver) Android安全开发基础: 四大组件之内容提供器(Content Provider) Android安全开发基础: 进程间通信...
android service的实例程序,用于博文http://blog.csdn.net/xianming01/article/details/7341877
android,启动service,并且service把值传给Activity显示
关于Android Service的简单实例:属于start service类型,而不是bound service。
android aidl service
android的开发移动端MQTT服务器所需要的依赖包文件。可下载到本地使用。
NULL 博文链接:https://chaowen0668.iteye.com/blog/1090096
3 9 3 服务 Service 3 9 4 内容提供者 Content Provider 第4章 对话框 信息提示和菜单 4 1 对话框 4 2 信息提示 4 2 1 Toast信息框 4 2 2 通知 Notification 4 3 菜单 第5章 文件存储 5 1 SharedPreferences 5 2 ...