android 中的 Service 是一个优先级比较高的 系统组件 ,他不是一个独立的进程也不是一个线程 !
文档中有说明:
A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.
A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
Service 没有用户界面,可以认为是在系统中永久运行的组件 .(这个是一个非常重要的特性 )
( 如果不是调用 stopService,unbindService,或者 stopSelf() 系统会让他一直运行下去,就算因为没有资源暂时停止,稍后也会再次运行,就算手动停止所在进程,系统也会重新启动该服务.)
启动:
可以使用 Context.startService(Intent) 或者 Context.bindService(Intent intent, ServiceConnection connn, int flags); 启动.
停止:
使用Context.stopService(Intent) 或者 Context.unBindService(ServiceConnection); 停止 . 但是必须所有服务连接关闭之后Service才能真正停止 !
使用准备: 需要在 AndroidManifest.xml中注册你的 Service
比如: ( 简单点的) <service android:name =".LocalService"/>
再如: ( 复杂点的):
<service android:name =".MyService" ------名字这是必须的
android:process =":service" ------进程名
>
<intent-filter>
<!-- AIDL完整路径名。必须指明,客户端能够通过AIDL类名查找到它的实现类 -->
<action android:name="com.en.demo.service.remoteServices.MyServiceBinder" />
</intent-filter>
</service>
进程内使用:
可以通过startService(Intent);来启动 service 这个方法可以使用在一些自动执行的服务中,比如自动检测手机信息,自动检测软件版本等.
通过 boolean android.content.ContextWrapper.bindService(Intent service, ServiceConnection conn, int flags) 可以绑定服务( 绑定是什么东东? 我的理解就只是给你一个对象 ,让你可以找到 你的服务的对象 ,这样可以调用服务的功能 ) 绑定之后就可以 调用啦.
其中参数 : Intent 就是和startService一样都是需要告诉系统启动那个服务
ServiceConnection 就是一个连接成功调用的接口 当服务启动成功,系统将调用这个接口的 onServiceConnected (ComponentName name, IBinder service)方法 这个方法传入了可以 找到服务的 参数
flags 是标记那个调用者的
为什么说 这样可以找到服务呢?
如果我们继承了Service 可以看到 Service中有一个 未实现的方法: public IBinder onBind(Intent intent) ;
可以看到这里返回的是一个 IBinder 和前面 onServiceConnected传入的参数一样.一切就是从这里开始做文章的.
这是我的例子中的一个服务:
public class LocalService extends Service {
class MyBinder extends Binder{ // Binder 是 IBinder 接口的一个实现可以让我们不必写出全部抽象方法
public Service getService(){
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
/**** 这个服务的 一些功能 ( 略 )***/ }
从这里开始我们可以看到 MyBinder 可以返回我们的 Service 对象.
从调用那里就可以这样做
// 创建本地调用对象
private ServiceConnection localConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
/* 获得对象 */
localService = (LocalService) ((LocalService.MyBinder) service)
.getService(); // 这里我们就可以获得 这个服务的引用了.
System.out.println("Bind local Service Success: " + localService);
}
@Override
public void onServiceDisconnected(ComponentName name) {
localService = null;
}
};
但是这样引用了有什么用 ? 我的例子中运行界面是 :
这里点击 " 获取名字 "按钮时候的代码是:
public void onClick(View v) {
try {
if (onBind) {
showResult.setText("本地服务->获取名字: "
+ localService.getName()); // getName 是一个功能
} else {
Toast.makeText(StartActivity.this, "请先绑定服务 ",
Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
我们就可以直接使用 服务的实例进行工作了.
具体功能可以看工程里面的代码.
跨进程服务:
我们可以调用系统提供的服务,比如
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); // 这里 获得一个 系统服务am.restartPackage(getPackageName());
这样可以关闭当前进程
我们的服务也可以为别人的程序服务,只要我们实现了接口,并在androidMainfast.xml中写清楚了就可以了
更重要的我们需要了解一个 AIDL ( android interface definition language )接口描述语言
我们不可能无缘无故自己的程序中写一个 interface 然后就说那是某个服务的接口吧.我们怎么样才知道有这个接口呢? aidl 提供了这个功能.
提供服务端:
当我们创建一个 aidl 文件 并在其中写入我们的接口的时候,adt 会自动生成对应的接口文件 .java 文件这样我们在我们的服务中实现这个接口就可以了.
比如我这个例子中是在一个 RemoteServices的工程中 实现提供了一个服务,
这个服务提供了那些对外服务? 我们就在 MyServiceBinder .aidl这个文件中描述了.
aidl 这个文件使用的语法与 java一样
package com.en.demo.service.remoteServices;
//import com.en.demo.service.MyObject;
interface MyServiceBinder{
int getAdd(int a,int b);
String getName();
void setName(String name);
//MyObject getObj();
void makeBoardCast();
}
这样在MyService中再:
用一个MyBinder类来继承
public class MyBinder extends MyServiceBinder.Stub{ //// z注意这里继承的是 Stub这个 类!!!
/* 服务提供的一些方法 */
public int getAdd(int a, int b) throws RemoteException {
return a + b;
}
public String getName() throws RemoteException {
return MyService.this.name;
}
public void setName(String name) throws RemoteException {
MyService.this.name = name;
}
public IBinder asBinder() {
return MyBinder.this;
}
public void makeBoardCast() throws RemoteException {
boardCast();
}
}
而在接收端:
MyServiceBinder remoteService ;
// 创建远程调用对象
private ServiceConnection remoteConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
// 从远程service中获得AIDL实例化对象
remoteService = MyServiceBinder.Stub.asInterface(service);
System.out.println("Bind remote Service Success:" + remoteService);
}
public void onServiceDisconnected(ComponentName name) {
remoteService = null;
}
};
这样我们就可以调用这个服务了....
想要更具体的实现,看代码.这个远程的服务有开启新线程进程操作,并通过广播通知调用者
Technorati 标签: android service 服务
分享到:
相关推荐
在《android service 学习笔记(下)》中,会介绍如何通过AIDL(Android Interface Definition Language)实现对Service的远程调用,这允许不同进程间的组件通信,增强了Service的功能和使用范围。 总结来说,...
在“android service 学习笔记(下)”中,主要讨论了如何利用AIDL(Android Interface Definition Language)进行跨进程通信(IPC, Inter-Process Communication)。 AIDL是一种接口描述语言,它的作用是在Android...
每个Android应用都由一系列组件构成,包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。活动是用户与应用交互的主要入口,服务在后台运行,广播接收器...
Android组件(如Activity、Service)有各自的生命周期,理解并合理管理生命周期对于避免内存泄漏和提高应用性能至关重要。例如,使用ViewModel保存界面状态,配合LiveData实现数据观察。 9. **Material Design** ...
AMS 是 Android 应用程序管理的核心服务,负责处理 Activity、Service、BroadcastReceiver 的生命周期管理。通过分析 AMS 的源码,我们可以深入理解 Android 应用的启动流程和状态转换。 4. **ContentProvider** ...
接着,笔记可能会深入到Android应用的四大组件——活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供者(ContentProvider)。活动是用户与应用交互的窗口,服务则在后台运行,不与用户...
以上只是Android开发教程笔记可能涵盖的部分内容,具体的学习过程中还会涉及更多高级主题,如动画、通知、推送服务、多媒体处理、蓝牙通信、安全性、国际化等。这份完全版的教程应该会详细讲解这些知识点,并提供...
接着,笔记详细阐述了Android应用的基本结构,包括Activity、Intent、Service和BroadcastReceiver等核心组件。Activity作为用户界面的主要载体,Intent则用于不同组件间的通信。Service用于在后台执行长时间运行的...
这份"Android开发教程笔记完全版"的压缩包文件包含了全面的学习资料,对于初学者和有一定经验的开发者来说,都是宝贵的资源。下面我们将深入探讨其中可能涵盖的知识点。 1. **Android系统架构**:Android系统分为...
这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
【Android开发教程笔记完全版】是一份全面的Android开发学习资料,旨在帮助新手小白和有一定经验的程序员深入理解和掌握Android应用开发技术。这份资源包含了从基础到进阶的多个层次的知识点,对于想要踏入Android...
Android开发学习笔记(整理),整理论坛android学习笔记,较完整的讲解了android的内容。包括:view、activity、service、intent、广播机制、http连接、数据sqllite存储、后台线程、各种layout、偏好、本地文件操作、...
Android基础学习笔记主要涵盖了一系列关于Android开发的基本概念和关键组件,以下是这些知识点的详细解析: 1. **Activity**: 是Android应用程序的基本单元,它代表用户在屏幕上看到的一个界面。每个Activity都必须...
1. **基础理论**:Android系统架构、组件模型(Activity、Service、BroadcastReceiver、ContentProvider)以及Intent机制是Android开发的基础。理解这些概念有助于构建应用程序的骨架。 2. **编程语言**:主要使用...
7. **服务(Service)**:Service是Android中用于在后台长时间运行的组件,适用于音乐播放、后台下载等场景。学习启动服务、绑定服务及其生命周期管理。 8. **BroadcastReceiver**:广播接收器可以监听系统或自定义...
同时,可能会讲解服务(Service)的概念,它是后台运行的组件,不直接与用户交互。 **day06**可能讲解的是BroadcastReceiver,它是接收系统广播消息的组件,例如设备开机、网络状态改变等。此外,还可能涵盖...
【Android培训笔记详解】 在移动应用开发领域,Android操作系统占据着重要的地位,为开发者提供了丰富的API和工具。这篇“黑马Android培训笔记”是专为学习Android编程设计的,旨在帮助初学者快速掌握Android开发的...
它可能会讲解Android的组件模型,包括四大组件——活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider),这些都是构建Android应用的核心元素。 接下来,笔记...
Android基础笔记是对Android操作系统开发入门知识的系统整理。Android是一种基于Linux内核的开源移动设备操作系统,由Google主导开发并广泛应用于智能手机、平板电脑及智能电视等设备。这份笔记涵盖了Android开发的...