当前位置:首页 » 安卓系统 » android获取service

android获取service

发布时间: 2024-03-28 00:00:22

A. android 怎么获取service实例

public class ServiceList extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

ActivityManager activityManger = (ActivityManager) getSystemService(ACTIVITY_SERVICE);// 获取Activity管理器
List<ActivityManager.RunningServiceInfo> serviceList = activityManger.getRunningServices(30);// 从窗口管理器中获取正在运行的Service
tv.setText(getServicesName(serviceList));

setContentView(tv);
}

private boolean ServiceIsStart(List<ActivityManager.RunningServiceInfo> list, String className) {// 判断某个服务是否启动
for (int i = 0; i < list.size(); i++) {
if (className.equals(list.get(i).service.getClassName()))
return true;
}
return false;
}

private String getServicesName(List<ActivityManager.RunningServiceInfo> list) {// 获取所有服务的名称
String res = "";
for (int i = 0; i < list.size(); i++) {
res += list.get(i).service.getClassName() + "/n";
}
return res;
}
}

B. Android应用组件 —— Service

官方原文: 地址
本文摘录自官方原文,方便自己观看。

service 是一个可以在后台长时间运行的操作而不提供用户界面的应用组件。服务可以由其他应用组件启动,而且即使用户切换到其他应用程序,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至执行进程间的通信(IPC)

服务基本分为两种形式:

启动

绑定

上述虽然分开概括这两种服务,但是服务可以同时以这两种方式运行,也就是说,他既可以是启动服务(以无限期运行),也允许绑定。问题在于是否实现了一组回调方法: onStartCommand() (允许组件启动服务)和 onBing() (允许绑定服务)。

无论应用是出于启动状态还是绑定状态,亦或处于启动并且绑定状态,任何应用组件均可以像使用Activity那么调用Itent来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。 使用清单文件声明服务部分将对此做更详尽的阐述。

注意:
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。这意味着,如果服务将执行任何CPU密集型工作或者阻止性操作(我理解为耗时操作,例如 MP3 播放或联网),则应在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。

要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务(如适用)。 应重写的最重要的回调方法包括:

onStartCommand()

onBind()

onCreate()

onDestroy()

如果组件通过调用 startService() 启动服务(这会导致对 onStartCommand() 的调用),则服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止它为止。

如果组件是通过调用 bindService() 来创建服务(且未调用 onStartCommand() ,则服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。

如同 Activity(以及其他组件)一样,您必须在应用的清单文件中声明所有服务。

要声明服务,请添加 <service> 元素作为 <application> 元素的子元素。例如:

为了确保应用的安全性, 请始终使用显式 Intent 启动或绑定 Service,且不要为服务声明 Intent 过滤器。 启动哪个服务存在一定的不确定性,而如果对这种不确定性的考量非常有必要,则可为服务提供 Intent 过滤器并从 Intent 中排除相应的组件名称,但随后必须使用 setPackage() 方法设置 Intent 的软件包,这样可以充分消除目标服务的不确定性。

此外,还可以通过添加 android:exported 属性并将其设置为 "false" ,确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即便在使用显式 Intent 时也如此

Service

IntentService

简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件。 因此,您应仅在必要时才创建服务。

如需在主线程外部执行工作,不过只是在用户正在与应用交互时才有此需要,则应创建新线程而非服务。 例如,如果您只是想在 Activity 运行的同时播放一些音乐,则可在 onCreate() 中创建线程,在 onStart() 中启动线程,然后在 onStop() 中停止线程。您还可以考虑使用 AsyncTask 或 HandlerThread,而非传统的 Thread 类。

前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。

要请求让服务运行于前台,请调用 startForeground() 。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification 。例如:

注意 :提供给 startForeground() 的整型 ID 不得为 0。

要从前台移除服务,请调用 stopForeground() 。此方法采用一个布尔值,指示是否也移除状态栏通知。 此方法不会停止服务。 但是,如果您在服务正在前台运行时将其停止,则通知也会被移除。

与 Activity 类似,服务也拥有生命周期回调方法,您可以实现这些方法来监控服务状态的变化并适时执行工作。 以下框架服务展示了每种生命周期方法:

:与 Activity 生命周期回调方法不同,您 需要调用这些回调方法的超类实现。

:尽管启动服务是通过调用 stopSelf() 或 stopService() 来停止,但是该服务并无相应的回调(没有 onStop() 回调)。因此,除非服务绑定到客户端,否则在服务停止时,系统会将其销毁 — onDestroy() 是接收到的唯一回调。

C. Android Service 为什么要绑定服务 仅仅是因为要获取服务中的方法吗

Android中Service是运行在后台的东西,级别与activity一样。

既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。

你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。

Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作。你可以在服务中开一一个线程,在线程中做耗时动作。


服务一般分为两种:

1:本地服务,Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

3.Service的生命周期


context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。


4.如果你Activity不绑定服务,那么就无法与远程服务进行通信

例如你要调用其它应用的服务(进程之间的通信)


有关更多的RPC通信建议查看android官网的API

D. mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器

1 从Service继承一个类。
2 创建startService()方法。
3 创建endService()方法 重载onCreate方法和onDestroy方法,并在这两个方法里面来调用startService以及endService。
4 在startService中,通过getSystemService方法获取Context.LOCATION_SERVICE。
5 基于LocationListener实现一个新类。默认将重载四个方法onLocationChanged、onProviderDisabled、onProviderEnabled、onStatusChanged。对于onLocationChanged方法是我们更新最新的GPS数据的方法。一般我们的操作都只需要在这里进行处理。
6 调用LocationManager的requestLocationUpdates方法,来定期触发获取GPS数据即可。在onLocationChanged函数里面可以实现我们对得到的经纬度的最终操作。
7 最后在我们的Activity里面通过按钮来启动Service,停止Service。
示意代码如下:
package com.offbye.gpsservice;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class GPSService extends Service {
// 2000ms
private static final long minTime = 2000;
// 最小变更距离10m
private static final float minDistance = 10;
String tag = this.toString();
private LocationManager locationManager;
private LocationListener locationListener;
private final IBinder mBinder = new GPSServiceBinder();
public void startService() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new GPSServiceListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance,
locationListener);
}
public void endService() {
if (locationManager != null && locationListener != null) {
locationManager.removeUpdates(locationListener);
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}

E. android 怎么获得bluetootha2dpservice

这是个隐藏类,你可以通过反射来使用它,也可以去这看看隐藏API和Internal包的使用

首先我们要明白为什么隐藏API(有@hide标记)和Internal包不能使用。
当我们使用android的SDK进行开发的时候都会用到一个非常重要的jar文件--android.jar(SDK_DIR/platforms/platform-X/android.jar,X是API等级)。这个包中移除了所有被标记的尾@hide的类、方法、枚举、字段和Internal包。当我们的程序在设备上运行的时候会加载设备上的一个framework.jar的文件,它包含了移除的部分。

所以我们的思路是想办法得到framework.jar将那些缺少的API拿出来放到android.jar中。当然这些都可以通过编译源码来解决,但那样太过麻烦。下面我介绍一种简单的方法来获取这些内容。

1,获取framework.jar
刚才也说了,设备上有这个文件,那么我们就从设备上来取。通过adb pull命令(也可以用DDMS):
adb pull /system/framework/framework.jar
我们需要该包中的classes.dex文件。这里从4.0以下模拟器上取,真机上一般是经过优化了的.odex文件,而4.0以上的模拟器中的这个文件中没有classes.dex文件。
如果需要4.0以上的可以在网上找找。

2,将framework.jar改成framework.zip,解压,得到里面的classes.dex文件。

3,将.dex文件转换成.jar格式。这里用到了dex2jar这个工具,知道反编译的同学都知道这个工具,没有的可以在网上找找。
转换结束后会得到一个classes.dex.dex2jar.jar文件。

4,重命名classes.dex.dex2jar.jar成classes.dex.dex2jar.zip,解压。得到以下文件。

5,将SDK_DIR/platforms/platform-X/中的android.jar拷贝出来,改成android.zip解压,得到以下结构的文件。将上面得到的文件复制到下面文件夹中(覆盖替换)。

6,全选上面的文件,打包成original-android.zip。
7,将original-android.zip改成original-android.jar。

OK,完成。
最简单的方法就是将这个包直接导入我们的工程,在工程中就可以使用隐藏API和Internal包了。

热点内容
提升访问 发布:2024-11-27 23:41:39 浏览:820
为什么学习编程 发布:2024-11-27 23:41:37 浏览:941
98编程 发布:2024-11-27 23:41:31 浏览:924
紫光算法岗 发布:2024-11-27 23:36:14 浏览:335
文件加密解密工具 发布:2024-11-27 23:35:36 浏览:711
djangoajax文件上传 发布:2024-11-27 23:29:35 浏览:306
向日葵忘记访问密码 发布:2024-11-27 23:29:33 浏览:498
为什么服务器不增加计数器 发布:2024-11-27 23:17:06 浏览:560
无法安装sql2005 发布:2024-11-27 22:59:29 浏览:319
数据库是哪个文件 发布:2024-11-27 22:58:32 浏览:401