Android中的Service小结
简介
Service适合执行不需要和用户交互,而且长期运行的任务。即使程序被切换回后台,服务仍然可以正常运行。Service并不自动开启线程,默认运行在主线程中。
Service中需要重载的函数
onCreate()方法在服务创建的时候调用。onBind()是Service中唯一的抽象方法,必须要在子类中实现。 onStartCommand()在每次启动服务(startService)的时候调用,可用于服务一旦启动就立刻去执行某个动作。
onDestroy()在服务销毁(stopService)的时候调用,可用于收回资源
在Activity中启动和停止服务
可以通过Activity中的Intent来启动/停止Service
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
break; Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
break;
在Activity中控制Service
需要创建一个类继承自Binder,然后在里面定义一些处理任务的函数。接着在MyService中创建这个类的实例,并在onBinder中返回。在Activity中创建ServiceConnection匿名类,覆盖onServiceConnected和onServiceDisconnected函数。这两个类在bind和unbind时被调用。
Service的生命周期
在Context中调用startService方法,相应的服务会自动启动,并回调onCreate->onStartCommand 在Context中调用bindService方法,可以获得一个服务的永久链接,并回调onCreate->onBind->onServiceConnected->onUnbind->onServiceDisconnected 销毁的时候不管调用了多少次onStartCommand只会调用一次onDestroy
绑定的Service在被绑定的Activity退出的时候会自动解除绑定。
向Service中传递数据
如果是通过startService启动,在startService的参数Intent中,可以通过putExtra附加数据。在Service端,通过onStartCommand的第一个参数获取这个传过来的值。
如果是通过bindService启动,在Service中的onBind函数会返回一个Binder对象,这个对象会在onServiceConnected中被返回。在Service的Binder对象中定义接口,在Activity中就可以调用。这种通过接口调用的方法要更高效。
从Service中返回数据
1, 在Service中定义callback
2, 在onBind返回的Binder中添加getService函数,让Activity可以取得Service的实例。然后就可以调用Service的setCallBack方法来添加需要通知的函数接口。
跨应用启动Service并传递数据:
在Android5.0之前可以通过隐式intent启动服务,但是Android5.0之后不可以了, 启动Service的Intent必须是Explicit的。
在两个Application之间是不可能获取到Service的定义的,需要调用SetComponent函数:
serviceIntent = new Intent();
serviceIntent.setComponent(new ComponentName("com.wanxiang.www.startservicefromanotherapp", "com.wanxiang.www.startservicefromanotherapp.AppService"));
serviceIntent.putExtra("data", "Hello AppService");
通过这种方法可以指定要启动的Service的Application,并且也同样可以传递数据过去。但是有个前提,被启动的这个Service所在的Activity必须在运行过程中的。
同样也可以通过绑定服务来启动远程Service
bindService(new Intent(this, MyService.class), this, BIND_AUTO_CREATE);
本地Activity中的onServiceConnected也会被执行:
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.println("Bind service");
System.out.println(iBinder);
}
传递数据:
首先在远程Activity的aidl目录中建一个本地Activity包名的目录,把本地Activity中的AIDL文件拷贝一份过去,可以在onBind()中返回这个接口的stub,并在这个接口中添加函数
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new IAppServiceRemoteBinderInterface.Stub() {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*
* @param anInt
* @param aLong
* @param aBoolean
* @param aFloat
* @param aDouble
* @param aString
*/
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } @Override
public void setData(String data) throws RemoteException {
AppService.this.data = data;
}
};
}
在远程Activity中的onServiceConnected函数中返回这个对象,并保存在类的实例变量中:
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.println("Bind service");
System.out.println(iBinder);
binder = IAppServiceRemoteBinderInterface.Stub.asInterface(iBinder);
} private IAppServiceRemoteBinderInterface binder = null;
然后就可以通过这个变量来调用AIDL中添加的函数,并传递数据给Service。
case R.id.btnSync:
if (binder != null)
try {
binder.setData(etInput.getText().toString());
前台Service
后台的Service会被回收,可以通过在Service中定义Notification,并调用startForeground()来使Service始终保持前台运行。
异步并且自动停止的服务
Android提供了一个IntentService专门解决创建一个异步线程并自动停止的问题。
只需要继承自这个类,并重写onHandleIntent方法,在这个方法里处理一些具体逻辑。这个方法运行在子线程里,不会造成ANR。
Android中的Service小结的更多相关文章
- Android 中的 Service 全面总结(转载)
转载地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 感谢作者 Android 中的 Service 全面总结 1.Ser ...
- (转载)Android中的Service:Binder,Messenger,AIDL(2)
前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...
- (转载)所有分类 > 开发语言与工具 > 移动开发 > Android开发 Android中的Service:默默的奉献者 (1)
前言 这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得.于是我就干脆花了点心 ...
- Android 中的 Service 全面总结
1.Service的种类 按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...
- Android 中的 Service 全面总结 (转)
原文地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类 按运行地点分类: 类别 区别 优点 ...
- 【转】Android中保持Service的存活
这几天一直在准备考试,总算有个半天时间可以休息下,写写博客. 如何让Service keep alive是一个很常见的问题. 在APP开发过程中,需要Service持续提供服务的应用场景太多了,比如闹 ...
- Android中的service
1.service简介:service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息 ...
- Android中的Service与进程间通信(IPC)详解
Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...
- Android中的Service组件具体解释
Service与Activity的差别在于:Service一直在后台执行,他没实用户界面,绝不会到前台来. 一,创建和配置Service 开发Service须要两个步骤:1.继承Service子类,2 ...
随机推荐
- php 5.3新增的闭包语法介绍function() use() {}
* 下面提到的代码在PHP5.3以上版本运行通过. */function callback($callback) { $callback();}//输出: This is a anonymous fu ...
- C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。
作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1) 输入10个无序的整数.(2) 用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3) 要求任意输入一个整数 ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- 总结common-dbutils.jar
2016/4/13 20:19:36 common-dbutils.jar 最核心的类:QueryRunner updata方法: int update(String sql,Object... pa ...
- Markdown中插入数学公式的方法
Markdown中插入数学公式的方法 文章来源:http://blog.csdn.net/xiahouzuoxin/article/details/26478179 自从使用Markdown以来,就开 ...
- Asp.net管道模型(管线模型)
Asp.net管道模型(管线模型) 前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...
- 18TH赛事管理
赛事管理者 项目psp: 一.计划 估计这个任务需要7天时间 二.开发 1.需求分析 作为一个赛事管理者,我希望知道每场比赛的队伍得分和积分情况,以便给每队进行排名. 2.生成设计文档 查询出每场得分 ...
- java覆盖重写规则
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开 ...
- Android之常用Git命令
Android之常用Git命令 代码修改后提交步骤:git status:查看代码修改状态git diff:查看代码修改细节,也能看代码空格git add . :添加新加入的代码git commit ...
- java模拟面试 试题
java 四类八种基本数据类型 第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 Boolean(取值为 true false) 第四类: ...