Android基础 : Android Service[转]
2019独角兽企业重金招聘Python工程师标准>>>
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。
为了处理这种后台进程,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();
}
private int statusCode;
private MyServiceBinder myServiceBinder = new MyServiceBinder();
@Override
public IBinder onBind(Intent intent) {
return myServiceBinder;
}
public int getStatusCode() {
return statusCode;
}
}
…
}
@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的话就需要使用 标签来指定相应的权限:
原文:http://www.fulema.com/viewthread.php?tid=5&extra=page%3D1
转载于:https://my.oschina.net/kevin008/blog/2197
Android基础 : Android Service[转]相关推荐
- Android基础——Android系统概览
1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...
- [Android 基础] -- Android 属性系统简介
一.简介 在 android 系统中,为同一管理系统的属性,设计了一个统一的属性系统.每个属性都有一个名字和值,他们都是字符串格式.属性被大量使用在 Android 系统中,用来记录系统设置或进程之间 ...
- Android基础(八) – Service AIDL
AIDL大多情况用于不同应用之间通信. (eg: A应用调用B应用的播放视频功能) 第一步:然后建立AIDL,通过点击建立AIDL文件,如图 第二步:在新建的AIDL文件里 写协议接口 interfa ...
- Android基础 - Android Studio 添加游戏音效
一.资源添加 在资源文件夹res中,创建raw文件夹,放置音频(mp3.wav).视频文件:New-Folder-Raw Resource Folder 文件命名格式:开头不能是数字,不能为大写字母. ...
- Android基础再回首——四大组件之Activity、Service俩兄弟
Android基础再回首--四大组件之Activity.Service俩兄弟 偶尔的回首过去,总是有不一样的收获.今天就来回顾下Activity和service吧,不用嫌弃太基础了,打好基础是取得成功 ...
- Android基础入门教程——4.2.3 Service精通
Android基础入门教程--4.2.3 Service精通 标签(空格分隔): Android基础入门教程 本节引言: 本节,我们继续来研究Service(服务)组件,本节将会学习下Android中 ...
- Android Studio开发基础之Service
1.Service的使用 Activity可以呈现一个用户界面,但是Service确实运行在后台,新建一个Myservice.java,会在AndroidManifest中自动配置<Servic ...
- android intent 源码,Android 基础之 IntentService 源码
Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...
- 自动生成Android界面,面向Android的Web Service界面自动生成技术研究
摘要: 据统计,开发人员在开发应用程序的过程中,接近一半的代码用于用户界面部分,大约一半的运行时间用于执行这一部分.所以,减少用户界面部分的开发代码和运行时间,能有效提高程序的运行效率.智能家居中,由 ...
最新文章
- 皮一皮:运气差,可能说的就是这个吧...
- Spring-AOP基础知识
- android应用兼容报告,手机资讯导报:华为发布国内首份Android7.0应用兼容报告
- Java多线程(二):Callable和FutureTask结合使用获取返回值
- MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB
- 计算机鼠标装有,计算机鼠标装有传感器来监视鼠标的移动情况,如图
- 银行突发事件演练方案_【工作动态】准旗联社组织开展优质文明服务应急演练,为优质服务保驾护航!...
- 我的日常Vim使用--凌波微步
- 【原】设置iOS项目BuildVersion自动增加
- NekoHtml 解析内容时需要注意的地方
- MATLAB的WFDB软件下载及使用
- 百度指数和股票的相关性
- 玩聚榜单-仿照Technorati的Popular频道
- 支付宝 手机页面支付 集成 出现 “系统繁忙,请稍后再试”
- vue3之watch和watchEffect实战总结
- 现代OpenGL教程(六):鼠标和键盘(imgui+OpenGL3.3)
- 批量提取文件夹下同类型文件/批量提取文件夹下不同名称文件夹的同类型文件
- 【AI with ML】第 5 章 :自然语言处理简介
- C++实现员工工资管理系统
- PADS 原理图/PCB常见错误及DRC报告网络问题