当前位置: 首页 > news >正文

得到手机后台中的应用程序

 

  我做悬浮窗的时候需要得到最近开启过的程序,包含图标、包名、应用名等等。

方法是从网上找的,原地址:http://www.apkbus.com/android-127953-1-1.html

其实里面就两个步骤:1.加载最近任务;2.给listview装载适配器

1.加载最近的任务 ,其中appNumber是加载的最近app的总数。

    /**
     * 核心方法,加载最近启动的应用程序 注意:这里我们取出的最近任务为 MAX_RECENT_TASKS +
     * 1个,因为有可能最近任务中包好Launcher2。 这样可以保证我们展示出来的 最近任务 为 MAX_RECENT_TASKS 个
     * 通过以下步骤,可以获得近期任务列表,并将其存放在了appInfos这个list中,接下来就是展示这个list的工作了。
     */
    public static void reloadButtons(Activity activity,List<HashMap<String, Object>> appInfos,int appNumber) {
        int MAX_RECENT_TASKS = appNumber; // allow for some discards
        int repeatCount = appNumber;// 保证上面两个值相等,设定存放的程序个数

        /* 每次加载必须清空list中的内容 */
        appInfos.removeAll(appInfos);

        // 得到包管理器和activity管理器
        final Context context = activity.getApplication();
        final PackageManager pm = context.getPackageManager();
        final ActivityManager am = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);

        // 从ActivityManager中取出用户最近launch过的 MAX_RECENT_TASKS + 1 个,以从早到晚的时间排序,
        // 注意这个 0x0002,它的值在launcher中是用ActivityManager.RECENT_IGNORE_UNAVAILABLE
        // 但是这是一个隐藏域,因此我把它的值直接拷贝到这里
        final List<ActivityManager.RecentTaskInfo> recentTasks = am
                .getRecentTasks(MAX_RECENT_TASKS + 1, 0x0002);

        // 这个activity的信息是我们的launcher
        ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(
                Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);
        int numTasks = recentTasks.size();
        for (int i = 0; i < numTasks && (i < MAX_RECENT_TASKS); i++) {
            HashMap<String, Object> singleAppInfo = new HashMap<String, Object>();// 当个启动过的应用程序的信息
            final ActivityManager.RecentTaskInfo info = recentTasks.get(i);

            Intent intent = new Intent(info.baseIntent);
            if (info.origActivity != null) {
                intent.setComponent(info.origActivity);
            }
            /**
             * 如果找到是launcher,直接continue,后面的appInfos.add操作就不会发生了
             */
            if (homeInfo != null) {
                if (homeInfo.packageName.equals(intent.getComponent()
                        .getPackageName())
                        && homeInfo.name.equals(intent.getComponent()
                                .getClassName())) {
                    MAX_RECENT_TASKS = MAX_RECENT_TASKS + 1;
                    continue;
                }
            }
            // 设置intent的启动方式为 创建新task()【并不一定会创建】
            intent.setFlags((intent.getFlags() & ~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
                    | Intent.FLAG_ACTIVITY_NEW_TASK);
            // 获取指定应用程序activity的信息(按我的理解是:某一个应用程序的最后一个在前台出现过的activity。)
            final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
            if (resolveInfo != null) {
                final ActivityInfo activityInfo = resolveInfo.activityInfo;
                final String title = activityInfo.loadLabel(pm).toString();
                Drawable icon = activityInfo.loadIcon(pm);

                if (title != null && title.length() > 0 && icon != null) {
                    singleAppInfo.put("title", title);
                    singleAppInfo.put("icon", icon);
                    singleAppInfo.put("tag", intent);
                    singleAppInfo.put("packageName", activityInfo.packageName);
                    appInfos.add(singleAppInfo);
                }
            }
        }
        MAX_RECENT_TASKS = repeatCount;
    }

 

2.写适配器 AppAdapter

package com.kale.appinfo;

import java.util.HashMap;
import java.util.List;

import android.app.ActivityManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;


public class AppAdapter implements ListAdapter{

    List<HashMap<String,Object>> appInfos;
    Context mContext;
    
    public AppAdapter(Context mContext,List<HashMap<String,Object>> appInfos) {
        this.appInfos = appInfos;
        this.mContext = mContext;
        
    }
    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
    }

    @Override
    public int getCount() {
        return appInfos.size();
    }

    @Override
    public Object getItem(int position) {
        return appInfos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    /**
     * 自定义view
     */
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater mInflater = LayoutInflater.from(mContext);
        View infoView = mInflater.inflate(R.layout.item, null);
        ImageView mImageView = (ImageView) infoView.findViewById(R.id.icon);
        TextView mTextView = (TextView) infoView.findViewById(R.id.title);
        TextView indexTv = (TextView)infoView.findViewById(R.id.index);
        Button clostBtn = (Button)infoView.findViewById(R.id.close);
        
        
        String title = (String) appInfos.get(position).get("title");
        Drawable icon = (Drawable) appInfos.get(position).get("icon");
        Intent singleIntent = (Intent) appInfos.get(position).get("tag");
        final String packageName = (String) appInfos.get(position).get("packageName");
        
        infoView.setTag(singleIntent);
        mImageView.setImageDrawable(icon);
        mTextView.setText(title);
        indexTv.setText(String.valueOf(position+1));
        clostBtn.setOnClickListener(new OnClickListener() {
            //根据包名来清除应用进程
            @Override
            public void onClick(View v) {
                ActivityManager mAm;
                mAm = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); 
                mAm.killBackgroundProcesses(packageName);
                Toast.makeText(mContext, "已清除进程的包名为:"+packageName, 0).show();
            }
        });
        
        //绑定点击事件,用来进行应用间的跳转
        infoView.setOnClickListener(new SingleAppClickListener());
        return infoView;
    }

    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return false;
    }
    
    //点击应用的图标启动应用程序
    class SingleAppClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            Intent intent = (Intent)v.getTag();
            if (intent != null) {
                intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
                try {
                    mContext.startActivity(intent);
                } 
                catch (ActivityNotFoundException e) {
                    Log.w("Recent", "Unable to launch recent task", e);
                }
            }
        }
    }
}

 

最后是MainActivity

package com.kale.appinfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ListView;


public class MainActivity extends Activity {

    private ListView list;
    
    //用来存放每一个recentApplication的信息,我们这里存放应用程序名,应用程序图标和intent。
    private List<HashMap<String,Object>> appInfos = new ArrayList<HashMap<String, Object>>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = (ListView)findViewById(R.id.listView);
        //设定显示的最大的任务数为20
        reloadButtons(this, appInfos, 20);
        
        list.setAdapter(new AppAdapter(this, appInfos));
    }
    
    /**
     * 核心方法,加载最近启动的应用程序 注意:这里我们取出的最近任务为 MAX_RECENT_TASKS +
     * 1个,因为有可能最近任务中包好Launcher2。 这样可以保证我们展示出来的 最近任务 为 MAX_RECENT_TASKS 个
     * 通过以下步骤,可以获得近期任务列表,并将其存放在了appInfos这个list中,接下来就是展示这个list的工作了。
     */
    public static void reloadButtons(Activity activity,List<HashMap<String, Object>> appInfos,int appNumber) {
        int MAX_RECENT_TASKS = appNumber; // allow for some discards
        int repeatCount = appNumber;// 保证上面两个值相等,设定存放的程序个数

        /* 每次加载必须清空list中的内容 */
        appInfos.removeAll(appInfos);

        // 得到包管理器和activity管理器
        final Context context = activity.getApplication();
        final PackageManager pm = context.getPackageManager();
        final ActivityManager am = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);

        // 从ActivityManager中取出用户最近launch过的 MAX_RECENT_TASKS + 1 个,以从早到晚的时间排序,
        // 注意这个 0x0002,它的值在launcher中是用ActivityManager.RECENT_IGNORE_UNAVAILABLE
        // 但是这是一个隐藏域,因此我把它的值直接拷贝到这里
        final List<ActivityManager.RecentTaskInfo> recentTasks = am
                .getRecentTasks(MAX_RECENT_TASKS + 1, 0x0002);

        // 这个activity的信息是我们的launcher
        ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(
                Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);
        int numTasks = recentTasks.size();
        for (int i = 0; i < numTasks && (i < MAX_RECENT_TASKS); i++) {
            HashMap<String, Object> singleAppInfo = new HashMap<String, Object>();// 当个启动过的应用程序的信息
            final ActivityManager.RecentTaskInfo info = recentTasks.get(i);

            Intent intent = new Intent(info.baseIntent);
            if (info.origActivity != null) {
                intent.setComponent(info.origActivity);
            }
            /**
             * 如果找到是launcher,直接continue,后面的appInfos.add操作就不会发生了
             */
            if (homeInfo != null) {
                if (homeInfo.packageName.equals(intent.getComponent()
                        .getPackageName())
                        && homeInfo.name.equals(intent.getComponent()
                                .getClassName())) {
                    MAX_RECENT_TASKS = MAX_RECENT_TASKS + 1;
                    continue;
                }
            }
            // 设置intent的启动方式为 创建新task()【并不一定会创建】
            intent.setFlags((intent.getFlags() & ~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
                    | Intent.FLAG_ACTIVITY_NEW_TASK);
            // 获取指定应用程序activity的信息(按我的理解是:某一个应用程序的最后一个在前台出现过的activity。)
            final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
            if (resolveInfo != null) {
                final ActivityInfo activityInfo = resolveInfo.activityInfo;
                final String title = activityInfo.loadLabel(pm).toString();
                Drawable icon = activityInfo.loadIcon(pm);

                if (title != null && title.length() > 0 && icon != null) {
                    singleAppInfo.put("title", title);
                    singleAppInfo.put("icon", icon);
                    singleAppInfo.put("tag", intent);
                    singleAppInfo.put("packageName", activityInfo.packageName);
                    appInfos.add(singleAppInfo);
                }
            }
        }
        MAX_RECENT_TASKS = repeatCount;
    }
    
}

 

源码下载:http://download.csdn.net/detail/shark0017/7778865

 

相关文章:

  • SQLCLUSTER sql数据库监测工具
  • 通过Rman方式创建Oracle11g DataGuard物理备库
  • nmon 监控软件
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • Frame - 快速创建高品质的 Web 应用原型
  • [2544]最短路 (两种算法)(HDU)
  • Spring整合Quartz在Linux下定时器被调用两次
  • 8月第3周中国五大顶级域名增5.7万 美国减4.2万
  • 用cubieboard做示波器
  • STL标准容器类简介
  • 如何建设云数据中心
  • 执行计划中常见index访问方式(转)
  • 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
  • Sql语句执行顺序
  • Eclipse Java注释模板设置详解
  • axios 和 cookie 的那些事
  • CentOS 7 修改主机名
  • Java 最常见的 200+ 面试题:面试必备
  • JS 面试题总结
  • Phpstorm怎样批量删除空行?
  • swift基础之_对象 实例方法 对象方法。
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 闭包,sync使用细节
  • 编写符合Python风格的对象
  • #stm32驱动外设模块总结w5500模块
  • (16)Reactor的测试——响应式Spring的道法术器
  • (39)STM32——FLASH闪存
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (南京观海微电子)——I3C协议介绍
  • (一)RocketMQ初步认识
  • (一一四)第九章编程练习
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • ./和../以及/和~之间的区别
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [C语言]——柔性数组
  • [HDU3710]Battle over Cities
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [json]定义、读写
  • [LaTex]arXiv投稿攻略——jpg/png转pdf
  • [lintcode easy]Maximum Subarray
  • [Mac软件]Goldie App v2.2 Mac黄金比例设计工具
  • [NOIP2000] 乘积最大
  • [one_demo_1]php中的文件锁
  • [PAT练级笔记] 44 Basic Level 1044 火星数字
  • [Python] Ubuntu12.04LTS
  • [PyTorch][chapter 63][强化学习-QLearning]
  • [Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作