7、四大组件之二-Service高级
一、Native Service
1>什么是Native Service
使用JNI编写,在系统启动完成之前启动的系统级服务。
2>哪些服务是Native Service
ACCESSIBILITY_SERVICE
ACCOUNT_SERVICE
ACTIVITY_SERVICE
ALARM_SERVICE
AUDIO_SERVICE
CLIPBOARD_SERVICE
CONNECTIVITY_SERVICE
DEVICE_POLICY_SERVICE
DOWNLOAD_SERVICE
DROPBOX_SERVICE
INPUT_METHOD_SERVICE
KEYGUARD_SERVICE
LAYOUT_INFLATER_SERVICE
LOCATION_SERVICE
NOTIFICATION_SERVICE
POWER_SERVICE
SEARCH_SERVICE
SENSOR_SERVICE
STORAGE_SERVICE
TELEPHONY_SERVICE
UI_MODE_SERVICE
USB_SERVICE
VIBRATOR_SERVICE
WALLPAPER_SERVICE
WIFI_SERVICE
WINDOW_SERVICE
3>如何使用(示例)
//A. 怎么才能从资源文件中创建View呢?
////////////////////////////////////////////
//调用LAYOUT_INFLATER_SERVICE,从资源中创建layout.
////////////////////////////////////////////
LayoutInflater inflater= (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.list_item, null); //B. 手机底座(Dock)是一种外设,一般分为Car Dock和Desk Dock
//
//当插入手机底座时,我们可能需要带给用户不同的体验。
//如:当插入Car Dock时,用户可能是将手机放在汽车的手机底座上,并很有可能正在开车途中。
//此时我们应将某些界面转入驾驶模式,如精简用户界面、加大图标及文字的显示等,以方便用户操作。
//
//那么,我们应当如何了解手机底座的插入状态呢?
//
////////////////////////////////////////////
//使用UI_MODE_SERVICE查看当前手机的底座状态
////////////////////////////////////////////
UiModeManager uiModeManager = (UiModeManager)getSystemService(Context.UI_MODE_SERVICE);
switch(uiModeManager.getCurrentModeType())
case Configuration.UI_MODE_TYPE_NORMAL:
dockState.setText("no dock");
break;
case Configuration.UI_MODE_TYPE_CAR:
dockState.setText("car dock mode");
break;
case Configuration.UI_MODE_TYPE_DESK:
{
dockState.setText("desk dock mode");
break;
}
4>Native Service的创建过程 (在系统启动完成之前)
(1) 获取Default Service Manager
(2) 创建NativeService并加入ServiceManager
(3) 启动线程池,开始处理Application传入的请求
二、Bound Service
1>什么是Bound Service
2>怎么使用
【Service】
//示例3.3.2
//BinderService.java
public class BinderService extends Service { public interface ICallback{
//在收到Message时被调用
public void onMessage(String msg);
}
private Set<ICallback> mCallbackList = new HashSet<ICallback>(); public class ServiceBinder extends Binder{
//将收到的Message通知所有的Callback
public void sendMessage(String msg){
for (ICallback c : mCallbackList){
c.onMessage(msg);
}
} //将Callback添加到链表
public void RegisterCallback(ICallback callback){
mCallbackList.add(callback);
} //将Callback从链表中删除
public void UnregisterCallback(ICallback callback){
mCallbackList.remove(callback);
}
}
private ServiceBinder mBinder = new ServiceBinder();
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
}
(1)创建Service并在AndroidManifest.xml中添加相关信息
(2)继承Binder类
(3)在OnBind()函数中返回Binder对象
【Client (如Activity)】
//示例3.3.3
//ServiceTestActivity.java public class ServiceTestActivity extends Activity{
private ServiceBinder mService = null; //实现Service的Callback, 当收到Message时, 使用Toast将其显示出来
private ICallback mCallback = new ICallback(){
@Override
public void onMessage(String msg) {
Toast.makeText(getApplication(), "Get message: " + msg, Toast.LENGTH_LONG).show();
}
}; //在OnCreate时BindService
//但需注意的时,此时Service还没有被绑定,而需要等到onServiceConnected执行时才能使用。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bindService(new Intent(this, BinderService.class), mConnection, BIND_AUTO_CREATE);
} //在onDestroy时unbindService,mService不应再被使用
@Override
protected void onDestroy() {
if (mService != null){
mService.UnregisterCallback(mCallback);
unbindService(mConnection);
} super.onDestroy();
} private ServiceConnection mConnection = new ServiceConnection() {
//Service绑定完成
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
mService = (ServiceBinder) service;
mService.RegisterCallback(mCallback);
mService.sendMessage("Service Connected!");
}
//Service已断开
@Override
public void onServiceDisconnected(ComponentName className) {
mService = null;
}
};
}
(1)调用BindSerive
(2)实现ServiceConnection
(3)在onServiceConnected中保存由Service提供的Binder对象
3>如何与Client交互
(1)编写ICallback接口
(2)在Service的Binder类中实现RegisterCallback和UnregisterCallback
(3)在Client中调用RegisterCallback
4>分类
【Local Service】
只能被当前进程调用 参考:示例3.3.2, 3.3.3
【Remote Service】
可以被其它进程调用的Service, 可用于进程间的数据共享。
1>Service
(1) 创建AIDL文件
(2) //示例3.3.4
(3) //IRemoteService.aidl (5) package com.demo.service; (7) /*
(8) * 在AIDL文件中只能使用一下类型的数据:
(9) *
(10) * 基础类型(int, long, boolean等)
(11) * String
(12) * CharSequence
(13) * List
(14) * Map
(15) */
(16) interface IRemoteService {
(17) int getVersion();(18) }
(2) 在Service中实现AIDL中的接口,并返回给Client
//示例3.3.5
//RemoteService.java
public class RemoteService extends Service {
private static final int VERSION = 1492;
public class RemoteBinder extends IRemoteService.Stub{
@Override
public int getVersion() throws RemoteException {
return VERSION;
}
}
private RemoteBinder mBinder = new RemoteBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
(3) 在AndroidManifest中添加相关信息
//示例3.3.6
<serviceandroid:name="RemoteService">
<intent-filter>
<actionandroid:name="com.demo.service.action.REMOTE_SERVICE"/>
</intent-filter>
</service>
2>Client
(1) 复制AIDL文件至相应的目录
(2) 编译项目,Eclipse会自动生成相关的服务接口类
(3) 调用bindService绑定服务
//示例3.3.7
//注意:这里应该使用远程服务的action,而不能再直接用class
bindService(newIntent("com.demo.service.action.REMOTE_SERVICE"), mConnection,BIND_AUTO_CREATE);
//ServiceConnection
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//注意这里应该使用asInterface方法进行转换
mService = IRemoteService.Stub.asInterface(service);//(IRemoteService)service;
Log.e("Alfred", "onServiceConnected" + mService);
try {
Log.e("Alfred", "version: " + mService.getVersion());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};
三、什么时候使用Intent Service, 什么时候使用Bound Service
通常,在只需要Service执行一个简单的请求,只需要传递参数,而不在乎返回值、无需和Service有交互操作时,我们使用
IntentService。
若我们需要知道Service的处理结果,或者和Service之间有交互操作(一般通过Callback实现)时,我们使用Bound Service.
7、四大组件之二-Service高级的更多相关文章
- 11、四大组件之二-Service高级(二)Native Service
一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
- [Android四大组件之二]——Service
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...
- 6、四大组件之二-Service初步
一.什么是Service 有些用时比较长得操作我们希望他在后台运行 ,不耽误我们当前的操作 . 这就引入了Service概念 . 常见的比如:访问网络 , 文件IO操作 , 大数据的数据库任务,播放音 ...
- Android四大组件之服务-Service 原理和应用开发详解
一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...
- Android四大组件初识之Service
Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...
- 入职小白随笔之Android四大组件——服务(Service)
Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...
- Android四大组件之一:Service(服务)
Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...
随机推荐
- Xcode 合并分支报错
原理和操作步骤见如下转载的两篇文章, 我所使用的 svn 客户端软件是 Mac 下面的 Versions.app v1.06 这个版本包含一个多人开发的bug bug 的解决方案见我之前转载的两篇文章 ...
- js原生代码编写一个鼠标在页面移动坐标的检测功能,兼容各大浏览器
function mousePosition(e) { //IE9以上的浏览器获取 if (e.pageX || e.pageY) { return { ...
- <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。
前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...
- BZOJ 3997 TJOI2015 组合数学
分析一下样例就可以知道,求的实际上是从左下角到右上角的最长路 因为对于任意不在这个最长路的上的点,都可以通过经过最长路上的点的路径将这个点的价值减光 (可以用反证法证明) 之后就是一个非常NOIP的D ...
- js监听输入框值的即时变化onpropertychange、oninput
js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. // // 要达到的效果 ...
- 安装Hadoop系列 — 安装Eclipse
1.下载 Eclipse从 http://www.eclipse.org/downloads/index-developer.php下载合适版本,如:Eclipse IDE for C/C++ Dev ...
- 如何在VS2010中使用Async功能?
伴随C#5.0的发布,“异步”特性越来越深入人心:在VS2012中早就可以使用它大大简化异步编程的痛苦,那么在VS2010中呢?我们无法尝鲜么?答案是“No”!,其实我们可以这样做: 1)必须把你的V ...
- caffe简易上手指南(一)—— 运行cifar例子
简介 caffe是一个友好.易于上手的开源深度学习平台,主要用于图像的相关处理,可以支持CNN等多种深度学习网络. 基于caffe,开发者可以方便快速地开发简单的学习网络,用于分类.定位等任务,也可以 ...
- Windows 8 自带定时关机的4种实现方法
问题描述:前几天发布了一篇文章[ Windows 7/8 自带定时关机命令 ],文章中的用到的命令我在Windows 7都运行成功,但没有在Windows 8 上进行测试,因为我认为Windows 8 ...