`
lifeijiyuan
  • 浏览: 40174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

获得当前运行应用的名称

 
阅读更多
众所周知,通过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#获取当前运行的进程

    C#获取当前运行的进程,代码中引入的using System.Diagnostics; 是要用到名称空间中的Process 类,本例将枚举windows当前正在运行的所有进程,并把这些进程信息显示在ListView列表中,这些进程信息主要是进程的ID,...

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

    要获取当前运行的应用程序信息,我们通常会用到`ActivityManager`的以下方法: 1. `getRunningTasks(int maxNum)`:这个方法返回当前正在运行的任务列表,每个任务包含一个或多个Activity的堆栈。`maxNum`参数用于...

    在Java程序中获取当前运行程序的路径

    在Java编程语言中,获取当前运行程序的路径是一项常见的需求,这主要涉及到系统环境和程序资源的定位。本文将深入探讨如何在Java程序中获取这些信息,并提供多种方法来实现这一目标。 首先,我们可以通过`java.lang...

    C#获取桌面运行程序名称

    本篇文章将详细介绍如何使用C#调用Windows API来获取当前桌面正在运行的程序名称。 首先,我们需要引入必要的命名空间,以便在C#代码中使用P/Invoke(平台调用)特性来调用Windows API函数。`System.Runtime....

    获取当前运行的信息的软件源码

    ### 一、获取当前运行的信息 #### 1.1 概念理解 “获取当前运行的信息”通常指的是在程序运行时收集有关进程的各种信息,如进程ID、模块信息、父进程ID等。这种功能常用于调试、系统监控或性能分析等场景。 #### ...

    获得当前应用程序执行时所在的目录

    在编程领域,尤其是在开发桌面应用程序时,经常需要获取应用程序运行时所在的目录,以便于读取或写入资源文件、配置文件等。PowerBuilder(PB)是面向对象的第四代编程语言,广泛用于企业级应用开发。在PB中,如果...

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

    现在我们有了运行应用的列表,但通常我们只关心前台和可见的应用,而非后台进程。因此,可以通过检查`RunningAppProcessInfo`的`importance`字段来过滤出这些应用: ```java for (int i = 0; i (); i++) { ...

    判断当前VI运行在哪种模式下

    在LabVIEW编程环境中,了解当前VI(Virtual Instrument)运行的模式是至关重要的,因为它决定了你可以执行的操作和程序的行为。LabVIEW有两种主要的运行模式:开发模式和运行时模式。开发模式用于编写、调试和测试...

    C# Winform 获取当前路径.txt

    此方法可以获取当前正在运行的应用程序模块的完整路径。这里的“模块”一般指代的是程序的主要可执行文件。它包含了文件名、路径以及文件扩展名等信息,常用于调试或者记录程序的启动位置等场景。 ### 3. 获取和...

    C#利用ManagedWifi获取当前已经连接的WIFI的名称(SSID)

    在本文中,我们将深入探讨如何使用C#编程语言和ManagedWifi库来获取当前已连接的Wi-Fi网络的名称,也就是我们通常所说的SSID。ManagedWifi是一个.NET框架下的开源库,它为Windows操作系统提供了对无线网络配置的简单...

    获取手机所有应用信息

    1. **获取当前运行应用的信息**:可以使用`NSBundle`的`mainBundle`来获取当前运行应用的信息,如版本号、名称等。 ```swift let mainBundle = Bundle.main let appName = mainBundle.infoDictionary?[...

    Android 获取当前位置,地区名称完整实

    在Android开发中,获取设备的当前位置以及地区名称是常见的需求,比如用于导航、天气查询或者个性化服务等。本文将深入探讨如何在Android应用中实现这一功能,主要涉及以下几个知识点: 1. **Android权限管理**: ...

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

    "获取手机上正在运行的服务_DEMO"是一个示例,它演示了如何编程获取设备上当前正在运行的服务的相关信息。这个DEMO涵盖了以下几个重要的知识点: 1. **ServiceInfo**: 在Android SDK中,`ServiceInfo`类代表了服务...

    Servlet中获取运行环境信息

    在Servlet中获取运行环境信息是开发者常常需要掌握的一项技能,这对于调试、监控以及优化应用程序都至关重要。本资源通过几个具体的Servlet实例,展示了如何在Servlet中获取Servlet自身、服务器端以及客户端的相关...

    动态获取运行程序(控件)名称和内容程序(VB6.0源代码编写)

    在VB6.0中,我们可以利用API函数`EnumWindows`来枚举当前系统上所有的活动窗口,从而获取运行程序的名称。`EnumWindows`函数需要一个回调函数作为参数,该回调函数会为每个窗口调用一次,我们可以在回调函数中获取...

    获取当前所有进程 C#语言

    在C#编程中,获取计算机上当前运行的所有进程是一项常见的任务,这有助于监控系统资源的使用情况或进行系统管理。本篇文章将详细讲解如何利用C#实现这一功能,并结合具体的代码示例,深入理解相关知识点。 首先,...

    labview 编程技巧,用labview获取计算机名称

    在LabVIEW编程中,有时我们需要获取运行程序的计算机名称,这对于系统识别、日志记录或者网络通信等功能至关重要。本篇文章将深入探讨如何使用LabVIEW获取计算机名称。 首先,我们要了解LabVIEW中的VI(Virtual ...

    (VB)获取运行程序(控件)名称和内容

    在VB(Visual Basic)编程中,获取运行程序或控件的名称和内容是常见的需求,这对于调试、日志记录以及程序交互性具有重要意义。在这个主题中,我们将深入探讨如何实现这个功能。 首先,让我们理解“运行程序”的...

    Excel-VBA宏编程实例源代码-获取当前文件和文件夹的名称.zip

    在Excel-VBA宏编程中,获取当前文件和文件夹的名称是一项常见的需求,尤其是在处理大量数据和自动化工作流程时。这个实例源代码的目标是帮助用户更好地理解和应用VBA宏来实现这一功能。以下是对这个主题的详细解释:...

Global site tag (gtag.js) - Google Analytics