permission    

 

 

 

package yanbin.recent;

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

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
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.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;

/**
 * 弹出最近任务测试
 * @author yanbin
 *
 */
public class MainActivity extends Activity {
 private Dialog mDialog;
    private static int MAX_RECENT_TASKS = 12;    // allow for some discards
    private static int repeatCount = 12;//保证上面两个值相等
    //用来存放每一个recentApplication的信息,我们这里存放应用程序名,应用程序图标和intent。
    private List> appInfos = new ArrayList>();
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        reloadButtons();//程序加载的时候就加载出最近任务
    }
   
    public void click(View view){
     int id = view.getId();
     switch (id) {
  case R.id.btn:
   generateDialog();
   break;
  }
    }
   
    /**
     * 弹出最近任务对话框
     */
    public void generateDialog(){
     mDialog = new Dialog(this,R.style.dialog);
  LayoutInflater mInflater = LayoutInflater.from(this);
  View dialogView = mInflater.inflate(R.layout.choose_dialog, null);
  final GridView mGridView = (GridView) dialogView.findViewById(R.id.choose_dialog_gridview);
  mGridView.setAdapter(new MyAppAdapter());
  mDialog.setContentView(dialogView);
  mDialog.setCanceledOnTouchOutside(true);
  mDialog.show();
    }
   
    /**
     * 核心方法,加载最近启动的应用程序
     * 注意:这里我们取出的最近任务为  MAX_RECENT_TASKS + 1个,因为有可能最近任务中包好Launcher2。
     * 这样可以保证我们展示出来的  最近任务 为 MAX_RECENT_TASKS 个
     */
    private void reloadButtons() {
     
     //得到包管理器和activity管理器
        final Context context = this;
        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 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 singleAppInfo = new HashMap();//当个启动过的应用程序的信息
            final ActivityManager.RecentTaskInfo info = recentTasks.get(i);

            Intent intent = new Intent(info.baseIntent);
            if (info.origActivity != null) {
                intent.setComponent(info.origActivity);
            }
            //TODO 测试用,无意义代码
            String currentInfo = "PackageName==" + intent.getComponent().getPackageName() + ",ClassName==" + intent.getComponent().getClassName();
            /**
             * 如果找到是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);
                }
            }
            appInfos.add(singleAppInfo);
        }
        MAX_RECENT_TASKS = repeatCount;
    }
   
   
    /**
  * gridview的适配器
  * @author yanbin
  *
  */
 private class MyAppAdapter implements ListAdapter{

  @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(int position, View convertView, ViewGroup parent) {
   LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
   View infoView = mInflater.inflate(R.layout.choose_dialog_detail_info, null);
   ImageView mImageView = (ImageView) infoView.findViewById(R.id.app_icon);
   TextView mTextView = (TextView) infoView.findViewById(R.id.choose_dialog_detail_tv);
   String title = (String) appInfos.get(position).get("title");
   Drawable icon = (Drawable) appInfos.get(position).get("icon");
   Intent singleIntent = (Intent) appInfos.get(position).get("tag");
   infoView.setTag(singleIntent);
   mImageView.setImageDrawable(icon);
   mTextView.setText(title);
   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;
  }
 }
 
 /**
  * 点击应用图标即可启动程序
  * @author yanbin
  *
  */
 private 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 {
                 MainActivity.this.startActivity(intent);
                    if(mDialog != null)
                     mDialog.dismiss();
                } catch (ActivityNotFoundException e) {
                    Log.w("Recent", "Unable to launch recent task", e);
                }
            }
  }
  
 }
}

更多相关文章

  1. android中的style部分属性值介绍【一】
  2. Android应用开发——系统自带样式Android:theme
  3. Android应用开发——系统自带样式Android:theme
  4. Android应用开发——系统自带样式Android:theme
  5. Android应用开发——系统自带样式Android:theme
  6. android---自带样式
  7. android中的style部分属性值介绍
  8. [置顶] Android系统的样式style
  9. 用HTML5开发Android应用程序

随机推荐

  1. OWASP 维护的 PHP 安全配置速查表
  2. Javascript 到 PHP 加密通讯的简单实现
  3. PHP+Ajax如何实现上传文件进度条动态显示
  4. php统计文件中的代码行数
  5. 如何用PHP迭代器来实现一个斐波纳契数列
  6. PHP中常用的加密解密方法总结
  7. php获取当前执行的php文件的文件名
  8. 如何解决php Function split() is deprec
  9. php调取摄像头实现拍照功能的方法
  10. PHP中将字符串全部转为小写或大写的方法