众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下
PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这两类软件可使用以下方法:
a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。
b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。
大家可以看下代码,说明已经写在注释中。
获取应用的代码:
/**
* 查询手机内非系统应用
* @param context
* @return
*/
public static List<PackageInfo> getAllApps(Context context) {
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
//获取手机内所有应用
List<PackageInfo> paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++) {
PackageInfo pak = (PackageInfo) paklist.get(i);
//判断是否为非系统预装的应用程序
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
// customs applications
apps.add(pak);
}
}
return apps;
}
获取图片、应用名、包名:
PackageManager pManager = MessageSendActivity.this.getPackageManager();
List<PackageInfo> appList = Utils.getAllApps(MessageSendActivity.this);
for(int i=0;i<appList.size();i++) {
PackageInfo pinfo = appList.get(i);
ShareItemInfo shareItem = new ShareItemInfo();
//set Icon
shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
//set Application Name
shareItem.setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString());
//set Package Name
shareItem.setPackageName(pinfo.applicationInfo.packageName);
}
其中 ShareItemInfo 类是我本地自定义的,各位可以忽略!
另为,有人可能在找 分享应用列表,在此一并说下吧。
获取支持分享的应用的代码:
/**
* 查询手机内所有支持分享的应用
* @param context
* @return
*/
public static List<ResolveInfo> getShareApps(Context context){
List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
Intent intent=new Intent(Intent.ACTION_SEND,null);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("text/plain");
PackageManager pManager = context.getPackageManager();
mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
return mApps;
}
由于该方法,返回的并不是 PackageInfo 对象。而是 ResolveInfo。因此获取图片、应用名、包名的方法不一样,如下:
PackageManager pManager = MessageSendActivity.this.getPackageManager();
/*********************查询手机内所有支持分享的应用*********************/
List<ResolveInfo> resolveList = Utils.getShareApps(MessageSendActivity.this);
for(int i=0;i<resolveList.size();i++) {
ResolveInfo resolve = resolveList.get(i);
ShareItemInfo shareItem = new ShareItemInfo();
//set Icon
shareItem.setIcon(resolve.loadIcon(pManager));
//set Application Name
shareItem.setLabel(resolve.loadLabel(pManager).toString());
//set Package Name
shareItem.setPackageName(resolve.activityInfo.packageName);
}
总结:
通过 PackageInfo 获取具体信息方法:
包名获取方法:packageInfo.packageName
icon获取获取方法:packageManager.getApplicationIcon(applicationInfo)
应用名称获取方法:packageManager.getApplicationLabel(applicationInfo)
使用权限获取方法:packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)
.requestedPermissions
通过 ResolveInfo 获取具体信息方法:
包名获取方法:resolve.activityInfo.packageName
icon获取获取方法:resolve.loadIcon(packageManager)
应用名称获取方法:resolve.loadLabel(packageManager).toString()
===========================================================================
ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while(i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
try {
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
Log.w("LABEL", c.toString());
}catch(Exception e) {
//Name Not FOund Exception
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
我现在的解决办法是,先通过 ActivityManager.RunningAppProcessInfo.processName 得到正在运行的进程名processName,然后再通过PackageManager.getInstallApplications()得到所有系统安装的应用程序信息,包括processName,lable(真实的应用程序名),icon,memData(应用程序占用内存大小)。通过之前得到的运行应用的processName,匹配后边得到的processName,得到相应的应用名之类的信息。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
最近想做一个任务管理器练一练手,第一道题就是获取手机中正在运行的程序。后来在网上找了一下资料,终于有了眉目。废话不多说!看代码。
ActivityMain.java
view plain
public class ActivityMain extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
List<Programe> list = getRunningProcess();
ListAdapter adapter = new ListAdapter(list,this);
getListView().setAdapter(adapter);
}
//正在运行的
public List<Programe> getRunningProcess(){
PackagesInfo pi = new PackagesInfo(this);
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//获取正在运行的应用
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
//获取包管理器,在这里主要通过包名获取程序的图标和程序名
PackageManager pm =this.getPackageManager();
List<Programe> list = new ArrayList<Programe>();
for(RunningAppProcessInfo ra : run){
//这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。
if(ra.processName.equals("system") || ra.processName.equals("com.android.phone")){
continue;
}
Programe pr = new Programe();
pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
System.out.println(pi.getInfo(ra.processName).loadLabel(pm).toString());
list.add(pr);
}
return list;
}
}
ListAdapter.java
view plain
public class ListAdapter extends BaseAdapter {
List<Programe> list = new ArrayList<Programe>();
LayoutInflater la;
Context context;
public ListAdapter(List<Programe> list ,Context context){
this.list = list;
this.context = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null)
{
la = LayoutInflater.from(context);
convertView=la.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.imgage=(ImageView) convertView.findViewById(R.id.image);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
final Programe pr = (Programe)list.get(position);
//设置图标
holder.imgage.setImageDrawable(pr.getIcon());
//设置程序名
holder.text.setText(pr.getName());
return convertView;
}
}
class ViewHolder{
TextView text;
ImageView imgage;
}
PackagesInfo.java
view plain
public class PackagesInfo {
private List<ApplicationInfo> appList;
public PackagesInfo(Context context){
//通包管理器,检索所有的应用程序(甚至卸载的)与数据目录
PackageManager pm = context.getApplicationContext().getPackageManager();
appList = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
}
/**
* 通过一个程序名返回该程序的一个Application对象。
* @param name 程序名
* @return ApplicationInfo
*/
public ApplicationInfo getInfo(String name){
if(name == null){
return null;
}
for(ApplicationInfo appinfo : appList){
if(name.equals(appinfo.processName)){
return appinfo;
}
}
return null;
}
}
Programe.java
view plain
public class Programe {
//图标
private Drawable icon;
//程序名
private String name;
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
list_item.xml
view plain
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dip"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
分享到:
相关推荐
C#获取当前运行的进程,代码中引入的using System.Diagnostics; 是要用到名称空间中的Process 类,本例将枚举windows当前正在运行的所有进程,并把这些进程信息显示在ListView列表中,这些进程信息主要是进程的ID,...
要获取当前运行的应用程序信息,我们通常会用到`ActivityManager`的以下方法: 1. `getRunningTasks(int maxNum)`:这个方法返回当前正在运行的任务列表,每个任务包含一个或多个Activity的堆栈。`maxNum`参数用于...
在Java编程语言中,获取当前运行程序的路径是一项常见的需求,这主要涉及到系统环境和程序资源的定位。本文将深入探讨如何在Java程序中获取这些信息,并提供多种方法来实现这一目标。 首先,我们可以通过`java.lang...
本篇文章将详细介绍如何使用C#调用Windows API来获取当前桌面正在运行的程序名称。 首先,我们需要引入必要的命名空间,以便在C#代码中使用P/Invoke(平台调用)特性来调用Windows API函数。`System.Runtime....
### 一、获取当前运行的信息 #### 1.1 概念理解 “获取当前运行的信息”通常指的是在程序运行时收集有关进程的各种信息,如进程ID、模块信息、父进程ID等。这种功能常用于调试、系统监控或性能分析等场景。 #### ...
在编程领域,尤其是在开发桌面应用程序时,经常需要获取应用程序运行时所在的目录,以便于读取或写入资源文件、配置文件等。PowerBuilder(PB)是面向对象的第四代编程语言,广泛用于企业级应用开发。在PB中,如果...
现在我们有了运行应用的列表,但通常我们只关心前台和可见的应用,而非后台进程。因此,可以通过检查`RunningAppProcessInfo`的`importance`字段来过滤出这些应用: ```java for (int i = 0; i (); i++) { ...
在LabVIEW编程环境中,了解当前VI(Virtual Instrument)运行的模式是至关重要的,因为它决定了你可以执行的操作和程序的行为。LabVIEW有两种主要的运行模式:开发模式和运行时模式。开发模式用于编写、调试和测试...
此方法可以获取当前正在运行的应用程序模块的完整路径。这里的“模块”一般指代的是程序的主要可执行文件。它包含了文件名、路径以及文件扩展名等信息,常用于调试或者记录程序的启动位置等场景。 ### 3. 获取和...
在本文中,我们将深入探讨如何使用C#编程语言和ManagedWifi库来获取当前已连接的Wi-Fi网络的名称,也就是我们通常所说的SSID。ManagedWifi是一个.NET框架下的开源库,它为Windows操作系统提供了对无线网络配置的简单...
1. **获取当前运行应用的信息**:可以使用`NSBundle`的`mainBundle`来获取当前运行应用的信息,如版本号、名称等。 ```swift let mainBundle = Bundle.main let appName = mainBundle.infoDictionary?[...
在Android开发中,获取设备的当前位置以及地区名称是常见的需求,比如用于导航、天气查询或者个性化服务等。本文将深入探讨如何在Android应用中实现这一功能,主要涉及以下几个知识点: 1. **Android权限管理**: ...
"获取手机上正在运行的服务_DEMO"是一个示例,它演示了如何编程获取设备上当前正在运行的服务的相关信息。这个DEMO涵盖了以下几个重要的知识点: 1. **ServiceInfo**: 在Android SDK中,`ServiceInfo`类代表了服务...
在Servlet中获取运行环境信息是开发者常常需要掌握的一项技能,这对于调试、监控以及优化应用程序都至关重要。本资源通过几个具体的Servlet实例,展示了如何在Servlet中获取Servlet自身、服务器端以及客户端的相关...
在VB6.0中,我们可以利用API函数`EnumWindows`来枚举当前系统上所有的活动窗口,从而获取运行程序的名称。`EnumWindows`函数需要一个回调函数作为参数,该回调函数会为每个窗口调用一次,我们可以在回调函数中获取...
在C#编程中,获取计算机上当前运行的所有进程是一项常见的任务,这有助于监控系统资源的使用情况或进行系统管理。本篇文章将详细讲解如何利用C#实现这一功能,并结合具体的代码示例,深入理解相关知识点。 首先,...
在LabVIEW编程中,有时我们需要获取运行程序的计算机名称,这对于系统识别、日志记录或者网络通信等功能至关重要。本篇文章将深入探讨如何使用LabVIEW获取计算机名称。 首先,我们要了解LabVIEW中的VI(Virtual ...
在VB(Visual Basic)编程中,获取运行程序或控件的名称和内容是常见的需求,这对于调试、日志记录以及程序交互性具有重要意义。在这个主题中,我们将深入探讨如何实现这个功能。 首先,让我们理解“运行程序”的...
在Excel-VBA宏编程中,获取当前文件和文件夹的名称是一项常见的需求,尤其是在处理大量数据和自动化工作流程时。这个实例源代码的目标是帮助用户更好地理解和应用VBA宏来实现这一功能。以下是对这个主题的详细解释:...