zoukankan      html  css  js  c++  java
  • 得到手机后台中的应用程序

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

    方法是从网上找的,原地址: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

  • 相关阅读:
    ASP.NET MVC构建RESTful服务时返回Unauthorized(401)状态
    [原]jQuery Tab插件,用于在Tab中显示iframe,附源码和详细说明
    [转]线程间操作无效: 从不是创建控件“ *** ”的线程访问它。
    ASP.NET MVC中RESTful原教旨主义者的两个实现细节
    [原]C#绘制等值线二 等值线追踪
    Nginx+iptables 防DDOS,恶意访问,采集器
    Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)
    解决CC攻击,Linux VPS,登录SSH,登录进VPS控制面板
    Inno Setup打包程序默认选择创建桌面图标
    苹果笔记本连接黑莓设置
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3920208.html
Copyright © 2011-2022 走看看