Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用

主流双目相机技术参数横向评测:从ZED到国产新锐 本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。 阅读详情

 

                                                                                                       转载请注明出处:http://blog.youkuaiyun.com/qinjuning

            

 

                关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的

        应用程序,大家如果真正的有所兴趣,建议大家看看源码,不过丑化说在前面,我自己也没怎么看过这方面的源码,只在

        需要的时候,才跑过去翻翻。

         

             今天,在耐着最后一点性子,写下了这篇博文,基本上完成了整个应用程序功能模块的介绍,大家也在此系列上慢慢拓展。

 

  ActivityManager.RunningServiceInfo类:  封装了正在运行的服务信息

 

  获取系统里所有真正运行的服务是通过调用ActivityManager方法来得到的,具体方法如下:

 

                     List<ActivityManager.RunningServiceInfo> getRunningServices (int maxNum)

                         功能:返回所有正在运行的服务

                         参数:   maxNum 代表我们希望返回的服务数目大小,一般给个稍大的值即可, 例如,50 。 

                               

ActivityManager.RunningServiceInfo 类

  常用字段:

 

               long   activeSince        服务第一次被激活的时间, 包括启动和绑定方式

               int      clientCount          如果该Service是通过Bind方法方式连接,则clientCount代表了service连接客户端的数目

               int      crashCount          服务运行期间,出现死机的次数

               boolean   foreground   若为true,则该服务在后台执行

               int        pid                          如果不为0,表示该service所在的进程ID号( PS:为0的话我也不清楚 - - 求指点)

               int        uid                          用户ID 类似于Linux的用户权限,例如root等                    

              String   process                 进程名,默认是包名或者由属性android:process指定

              ComponentName  service          获得该Service的组件信息 包含了pkgname / servicename信息

 

PackageManger类

   说明: 封装了对应用程序信息的操作

        获得应用程序信息的的方法如下:

          public abstractApplicationInfo  getApplicationInfo(String  packageName, int flags)

                 参数:packagename 包名

                             flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可

                 功能:返回ApplicationInfo对象

 

        关于PackageManger更多信息,请查看<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>

 

   Task任务的使用,我也就不在赘述了,大家可以仔细看下SDK,在此推荐一篇博客来帮助大家理解。

          《Android系统的进程,任务,服务的信息》

 

 

Demo说明:

 

         我们获取了系统里正在运行的服务信息,包括包名,图标,service类名等。为了达到Settings下应用程序模块中的

    正在运行服务的效果,我们点击某一服务后,理论上来说是可以停止该服务的,但是由于权限permissions不够,可能报

    SecurityException异常,导致应用程序发生异常。

 

    关于权限不够的问题,可以分为两种:

       1、 在AndroidManifest.xml文件中,为<activity/>或<service/>节点指定android:permission属性时,在其他进程中操作时,

              需要 声明该permission权限 。 具体可以参考下面这篇文章:

                                              《android 自定义权限 permission》

 

       2、 系统权限,这个咱就没什么话说了。 可以参考下面这篇文章。

                                   《android.uid.system 获取系统权限 》

 

 

    截图如下:(加上了水印,请谅解)

 

                                                 

 

 

     老规矩,资源文件不在贴了。 主工程逻辑如下:

 

 

package com.qin.runservice;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Debug;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class BrowseRunningServiceActivity extends Activity implements
		OnItemClickListener {

	private static String TAG = "RunServiceInfo";

	private ActivityManager mActivityManager = null;
	// ProcessInfo Model类 用来保存所有进程信息
	private List<RunSericeModel> serviceInfoList = null;

	private ListView listviewService;
	private TextView tvTotalServiceNo;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.browse_service_list);

		listviewService = (ListView) findViewById(R.id.listviewService);
		listviewService.setOnItemClickListener(this);

		tvTotalServiceNo = (TextView) findViewById(R.id.tvTotalServiceNo);

		// 获得ActivityManager服务的对象
		mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

		// 获得正在运行的Service信息
		getRunningServiceInfo();
		// 对集合排序
		Collections.sort(serviceInfoList, new comparatorServiceLable());

		System.out.println(serviceInfoList.size() + "-------------");

		// 为ListView构建适配器对象
		BrowseRunningServiceAdapter mServiceInfoAdapter = new 
		         BrowseRunningServiceAdapter(BrowseRunningServiceActivity.this, serviceInfoList);

		listviewService.setAdapter(mServiceInfoAdapter);

		tvTotalServiceNo.setText("当前正在运行的服务共有:" + serviceInfoList.size());
	}
	// 获得系统正在运行的进程信息
	private void getRunningServiceInfo() {

		// 设置一个默认Service的数量大小
		int defaultNum = 20;
		// 通过调用ActivityManager的getRunningAppServicees()方法获得系统里所有正在运行的进程
		List<ActivityManager.RunningServiceInfo> runServiceList = mActivityManager
				.getRunningServices(defaultNum);

		System.out.println(runServiceList.size());

		// ServiceInfo Model类 用来保存所有进程信息
		serviceInfoList = new ArrayList<RunSericeModel>();

		for (ActivityManager.RunningServiceInfo runServiceInfo : runServiceList) {

			// 获得Service所在的进程的信息
			int pid = runServiceInfo.pid; // service所在的进程ID号
			int uid = runServiceInfo.uid; // 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
			// 进程名,默认是包名或者由属性android:process指定
			String processName = runServiceInfo.process; 

			// 该Service启动时的时间值
			long activeSince = runServiceInfo.activeSince;

			// 如果该Service是通过Bind方法方式连接,则clientCount代表了service连接客户端的数目
			int clientCount = runServiceInfo.clientCount;

			// 获得该Service的组件信息 可能是pkgname/servicename
			ComponentName serviceCMP = runServiceInfo.service;
			String serviceName = serviceCMP.getShortClassName(); // service 的类名
			String pkgName = serviceCMP.getPackageName(); // 包名

			// 打印Log
			Log.i(TAG, "所在进程id :" + pid + " 所在进程名:" + processName + " 所在进程uid:"
					+ uid + "\n" + " service启动的时间值:" + activeSince
					+ " 客户端绑定数目:" + clientCount + "\n" + "该service的组件信息:"
					+ serviceName + " and " + pkgName);

			// 这儿我们通过service的组件信息,利用PackageManager获取该service所在应用程序的包名 ,图标等
			PackageManager mPackageManager = this.getPackageManager(); // 获取PackagerManager对象;

			try {
				// 获取该pkgName的信息
				ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
						pkgName, 0);

				RunSericeModel runService = new RunSericeModel();
				runService.setAppIcon(appInfo.loadIcon(mPackageManager));
				runService.setAppLabel(appInfo.loadLabel(mPackageManager) + "");
				runService.setServiceName(serviceName);
				runService.setPkgName(pkgName);
				// 设置该service的组件信息
				Intent intent = new Intent();
				intent.setComponent(serviceCMP);
				runService.setIntent(intent);

				runService.setPid(pid);
				runService.setProcessName(processName);

				// 添加至集合中
				serviceInfoList.add(runService);

			} catch (NameNotFoundException e) {
				// TODO Auto-generated catch block
				System.out.println("--------------------- error -------------");
				e.printStackTrace();
			}

		}
	}

	// 触摸可停止
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position,
			long arg3) {
		// TODO Auto-generated method stub
		final Intent stopserviceIntent = serviceInfoList.get(position)
				.getIntent();

		new AlertDialog.Builder(BrowseRunningServiceActivity.this).setTitle(
				"是否停止服务").setMessage(
				"服务只有在重新启动后,才可以继续运行。但这可能会给电子市场应用程序带来意想不到的结果。")
				.setPositiveButton("停止", new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						// 停止该Service
						//由于权限不够的问题,为了避免应用程序出现异常,捕获该SecurityException ,并弹出对话框
						try {
							stopService(stopserviceIntent);
						} catch (SecurityException sEx) {
							//发生异常 说明权限不够 
                            System.out.println(" deny the permission");
                        	new AlertDialog.Builder(BrowseRunningServiceActivity.this).setTitle(
            				"权限不够").setMessage("对不起,您的权限不够,无法停止该Service").create().show();
     					}
						// 刷新界面
						// 获得正在运行的Service信息
						getRunningServiceInfo();
						// 对集合排序
						Collections.sort(serviceInfoList, new comparatorServiceLable());
						// 为ListView构建适配器对象
						BrowseRunningServiceAdapter mServiceInfoAdapter = new BrowseRunningServiceAdapter(
								BrowseRunningServiceActivity.this,
								serviceInfoList);
						listviewService.setAdapter(mServiceInfoAdapter);
						tvTotalServiceNo.setText("当前正在运行的服务共有:"
								+ serviceInfoList.size());
					}

				}).setNegativeButton("取消",
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								// TODO Auto-generated method stub
								dialog.dismiss(); // 取消对话框
							}
						}).create().show();
	}

	// 自定义排序 根据AppLabel排序
	private class comparatorServiceLable implements Comparator<RunSericeModel> {

		@Override
		public int compare(RunSericeModel object1, RunSericeModel object2) {
			// TODO Auto-generated method stub
			return object1.getAppLabel().compareTo(object2.getAppLabel());
		}

	}

}


         代码下载地址:http://download.youkuaiyun.com/detail/qinjuning/3846097

     

         终于完成了这几块功能的介绍,这些功能的具体使用都挺类似的,最重要的是看你有没有耐心去把他们做出来。

   作为一个小小程序员,我还是一步一步来做吧。。

 

 

    

 

 

2026年VIVO嵌入式岗位高频面试题(含参考答案) 摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。 阅读详情

相关推荐

本地部署DeepSeek-Coder-6.7B 离线版的完整指南:打造适配当前系统的AI助手

《DeepSeek-Coder-6.7B本地部署指南》详细介绍了如何离线部署这款专注于代码生成的AI模型。文章涵盖硬件要求(推荐8核CPU、32GB内存、NVIDIA RTX3080显卡)、软件依赖(Python3.8+、CUDA11.0+、PyTorch1.9+)以及具体安装步骤,包括模型下载、路径配置和GPU加速设置。重点说明如何通过输入系统配置文档和使用说明书,让模型生成适配特定系统的代码,并提供了参数调优和模型微调的方法。该指南旨在帮助开发者在本地安全高效地使用AI助手,实现代码自动生成与优化,提升

欢迎来到我的优快云博客!我专注于技术创新和数字化转型,特别是在低代码平台、人工智能和大数据分析领域的探索与应用。通过深入分析各种行业案例,帮助企业加速数字化进程,提升运营效率与创新能力。在这里,您将找到关于低代码平台、AI技术、数据分析与 1492

【Android开发】获取正在运行的Service服务的两种方法

安卓除了系统运行的Service,安装的APP也会提供各种各样的服务,如果我们想判断某个APP正在运行的Service有哪些,由于没有源码,除了使用ADB的方式,还可以可以采用下面两种方法。

m0_54137337的博客 2619

LibreNMS实战:5分钟搞定Docker部署与中文配置(附常见问题排查)

本文详细介绍了如何使用Docker在5分钟内快速部署LibreNMS,并完成中文界面优化。从环境准备到容器启动,再到中文语言包安装和系统配置调整,提供了完整的实战指南。同时,文章还包含常见问题排查和性能调优建议,帮助用户高效搭建网络监控系统。

e1f2g的博客 1281

Activity工作流(三):Service服务

Activity Service

专治八阿哥的孟老师 1104

多期DID实战指南:从CSDID原理到分组加权策略

本文深入解析多期DID(CSDID方法)在政策评估中的实战应用,从核心思想到分组加权策略全面讲解。通过电商扶贫等案例,详细演示如何正确处理分批实施政策的数据分析,包括分组拆解、子模块DID操作及加权平均选择,帮助研究者规避常见误区,提升政策评估的准确性。

weixin_26833503的博客 524

OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,这个OLED想做一个信息显示,可是商家给我的例程里就是88,816两种字体的格式,我的屏幕是0.91寸的8*16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪直接学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,勿喷。。 OLED屏幕驱动程序功能 我们对Markdown编辑器进行了一些功能拓展与语法支...

qq_44886611的博客 7781

Activity启动过程全解析

Activity启动过程一些基本的概念 ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期 ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作 Appli

水草葫芦娃的博客 637

Python 高级语法:闭包

闭包(Closure)是函数式编程中的一个重要概念。在Python中,闭包可以简单理解为:一种特殊的函数。外函数:嵌套函数中最外层的函数称之为外函数。内函数:嵌套函数中最内层的函数称之为内函数;内函数引用了外函数的临时变量;外函数的返回使用了临时变量的内函数。

moment159的博客 2353

安卓(Android)如何获取正在运行服务的详细信息

ActivityManager.RunningServiceInfo类: 封装了正在运行的服务信息      获取系统里所有真正运行的服务是通过调用ActivityManager方法来得到的,具体方法如下:      List getRunningServices (int maxNum)   功能:返回所有正在运行的服务   参数: maxNum 代表我们希望返回的服务数目大小,一般给个稍

残暴程序员的博客 3267

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 384

Ultralytics 框架中predict 与 track 的区别

在 Ultralytics 框架中,predict 和 track 是两种不同的推理方法,分别用于目标检测(或分割、姿态估计)和目标跟踪任务。

浩瀚之水的专栏 1126

Android中获取正在运行的服务 ActivityManager RunningServiceInfo的使用

Android中获取正在运行的服务 ActivityManager RunningServiceInfo的使用

gfuugff的博客 887

如何对EMB电子机械制动器的热衰退问题进行优化

摘要 电子机械制动器(EMB)在新能源汽车和自动驾驶中具有重要应用价值,但其在高强度工况下会出现热衰退现象。本文分析了EMB热衰退的五大机理:摩擦副热效应、电机热衰退、减速机构热失效、温度对控制策略干扰以及结构设计导致的热积累。针对这些问题,提出了从材料、结构、控制三个维度的优化措施:升级耐高温材料、改进散热设计、优化控制算法等。通过"热生成抑制-热传导优化-热失效补偿"的系统方案,可有效改善EMB的热衰退问题,为智能汽车提供更可靠的制动保障。

m0_59012156的博客 342

Android 获取正在运行的服务 ActivityManager.RunningServiceInfo使用

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          优快云:http://www.csdn.net          雨季o莫忧离:http://blog.csdn.net/luckkof 正文   关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO

奥特曼 1610

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android中获取正在运行的服务:ActivityManager.RunningServiceInfo的使用

ActivityManager.RunningServiceInfo类:  封装了正在运行的服务信息   获取系统里所有真正运行的服务是通过调用ActivityManager方法来得到的,具体方法如下:   List getRunningServices (int maxNum)   功能:返回所有正在运行的服务   参数:   maxNum 代表我们希望返回的服务数目大小,一般给

Gabriel的专栏 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android遍历获取正在运行的服务(ActivityManager.RunningServiceInfo)

public static boolean serviceIsRunning(Context context) { ActivityManager manager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningSe...

qq_40459430的博客 1716

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用(三)

转载请注明出处:http://blog.csdn.net/qinjuning                                关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的         应用程序,大家如果真正的有所兴趣,建议大家看看源码,不过丑化说在前面,我

qgr_lyy的博客 1105
上一篇: Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解
下一篇: Android中内容观察者的使用---- ContentObserver类详解
qinjuning
博客等级 码龄18年 5288粉丝 43原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值