`

Android中获取正在运行的服务

阅读更多
   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.csdn.net/detail/qinjuning/3846097

    

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

   作为一个小小程序员,我还是一步一步来做吧。。
分享到:
评论

相关推荐

    Android中获取正在运行的服

    `RunningServiceInfo`是`ActivityManager`的一个内部类,用于封装一个正在运行服务的详细信息,如服务的名字、服务所属的进程名、服务的启动次数等。 要获取正在运行的服务信息,首先需要在代码中获取`...

    Android中获取后台正在运行的应用列表

    在Android设备中,按Back键会将当前的Activity出栈销毁,而按HOME键却会将之隐藏到后台。如若有多个这样的程序这样操作,我们不知道后台到底有多少个正在运行的应用程序。此程序的目的就列举出后台正在运行的应用...

    获取手机正在运行的app,以及当前前台正在运行的app(兼容android6.0)

    对于获取运行中的APP信息,可能需要`GET_TASKS`权限,这是一个危险权限,因此需要在运行时请求。 以下是一个简单的步骤来获取正在运行的APP: 1. **请求权限**:在你的`AndroidManifest.xml`文件中声明`GET_TASKS`...

    Android中获取正在运行的应用程序ActivityManager的使用(二)

    在这个示例中,我们通过`getRunningAppProcesses()`获取运行中的应用进程,并检查每个进程的重要程度,如果进程是前台进程,我们就打印出它的名称。 总的来说,ActivityManager是Android开发者了解系统状态和应用...

    Android 5.0系统以上获取运行进程demo

    在这个特定的案例中,描述中提到提供了一个已经封装好的jar包,这可能是为了解决在Android 5.0及以上版本无法直接获取运行进程的问题。这个jar包可能包含了实现绕过限制、获取运行进程信息的替代方法。使用这样的第...

    获取手机上正在运行的服务_DEMO

    6. **权限控制**: 记住,由于隐私原因,从Android 6.0(API级别23)开始,获取运行服务的详细信息可能需要`GET_TASKS`权限。在运行时,应用需要检查并请求此权限,如果用户未授予,将无法获取服务信息。 7. **代码...

    Android获取正在运行程序并kill掉,密码http://blog.csdn.net/pishum/article/details/38875307里有

    这可能涉及到网络请求和数据解析的知识,但这里主要讨论的是Android获取运行程序和结束进程的方法。 总的来说,Android开发者可以通过`ActivityManager`获取运行的应用信息,并在适当的情况下结束进程。不过,这...

    Android获取正在运行程序源码

    2. **获取运行服务**:同样地,`ActivityManager`的`getRunningServices()`方法可以用来获取正在运行的服务列表。每个`RunningServiceInfo`对象包含了服务的包名、类名、启动次数等信息。 3. **获取应用进程**:`...

    Android获取正在运行程序并kill掉

    标题"Android获取正在运行程序并kill掉"涉及的关键知识点主要包括Android进程管理、系统权限、以及如何编程实现这个功能。以下将详细介绍这些内容。 首先,Android系统中的进程分为多个级别,如前台进程、可见进程...

    Android 低版本和高版本获取后台运行进程

    从Android 6.0(API Level 23)开始,系统引入了运行时权限管理,获取运行进程信息可能需要`GET_TASKS`权限。如果应用的目标SDK版本是23或更高,你需要在运行时请求这个权限。 4. **注意事项** 尽管可以通过`...

    android实现获取正在运行的应用程序

    下面我们将详细探讨如何在Android中实现获取正在运行的应用程序。 首先,我们需要访问`ActivityManager`服务,它是Android系统提供用来管理和控制活动的重要组件。通过`getSystemService`方法和`Context.ACTIVITY_...

    android手机正在运行的服务

    描述中提到的“获得当前android 手机正在运行的所有服务,并将其关闭”,意味着开发者或用户可能需要编写代码或者使用某些工具来监控这些服务,并根据需要关闭它们。这可能是因为有些服务可能消耗过多的资源,导致...

    Android 显示所有的正在运行程序

    以上就是如何在Android中显示所有正在运行的程序的基本步骤和原理。实际开发中,还需要考虑更多细节,如异常处理、UI设计、性能优化等。请根据具体项目需求进行适当调整。希望这个知识点能帮助你更好地理解和实现...

    Android 获取运用服务

    1. 权限问题:获取运行服务列表需要GET_TASKS权限,这在Android 6.0及以上版本可能需要动态申请。 2. 性能影响:频繁获取运行服务可能会影响应用性能,因此建议在必要时进行操作。 总结,获取Android设备上正在运行...

    Android中获取系统内存信息以及进程信息

    在Android系统中,开发者可以通过Android提供的API来获取系统的内存信息以及正在运行的进程状态。这一功能主要涉及到`ActivityManager`类的使用。`ActivityManager`是Android SDK中的一个关键组件,它提供了对系统...

    Android中运行权限

    在Android中,打电话权限属于危险权限,需要在运行时请求。以下是一个简单的请求打电话权限的步骤: 1. 添加权限声明:首先,在AndroidManifest.xml文件中声明所需的权限,如 `&lt;uses-permission android:name=...

    Android5.0 以上获取系统正在运行应用信息包

    在服务中定期执行获取运行应用的任务,但同样要注意系统的电池优化策略可能会影响服务的执行。 7. **第三方库**:有一些第三方库,如AppUsageTracker,可以帮助简化这个过程,但它们仍然是基于上述API的封装。 8. ...

    Android 通过process进程信息拿到当期正在运行的APP包名

    在Android中,我们可以通过Java代码执行shell命令来获取这些信息。 在给定的标题"Android通过process进程信息拿到当期正在运行的APP包名"中,提到的关键点在于获取“栈顶应用包名”,这意味着我们要找到用户当前...

    android获取当前壁纸

    以上就是Android获取当前桌面壁纸的基本步骤。如果你想要实现更复杂的功能,比如监听壁纸更改,可以注册BroadcastReceiver来监听ACTION_WALLPAPER_CHANGED广播。同时,你还可以利用Intent.ACTION_SET_WALLPAPER为...

Global site tag (gtag.js) - Google Analytics