android Dialog格局显示已打开的应用程序

android Dialog布局显示已打开的应用程序




               次想法是根据上一片博客改进而来,为了添加到framework中,基本代码相同,但是有所修改。将activity修改成Dialog布局的形式将已经打开的程序显示出来。


看一下大概图片吧:android  Dialog格局显示已打开的应用程序



首先用一个activity来显示一个button,为button添加点击事件,这个点击事件就是弹出dialog布局显示已经打开的程序,并可以实现点击回复程序所在页面,


以及长按关闭程序,activity代码:

package android.dialog.task;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Dialog_taskActivity extends Activity {
    private Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				Dialog_task dialog_task=new Dialog_task(Dialog_taskActivity.this);
				dialog_task.show();
			}
		});
        
    }
}

main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/text" />//注意这里一定要引用String,因为这个是要在源码下编译,不能直接在xml文件里写字母或数字

</LinearLayout>

再看看Dialog布局实现的功能:


代码有所改动,改动地方我会注释

package android.dialog.task;

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

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.SimpleAdapter.ViewBinder;

public class Dialog_task extends Dialog{
	private ListView listView;
	private PackageManager pm;
	private ActivityManager am;
//添加构造方法
 public Dialog_task(Context context) {
		super(context);
		LayoutInflater li = LayoutInflater.from(context); 
                View view = li.inflate(R.layout.task_main, null); 
		setContentView(view);
                //添加全局变量pm,am
                pm= context.getPackageManager();
		am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        listView=(ListView)findViewById(R.id.list_view);
        LoadList(context);
	}
	 public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);	
	    }
	 private void LoadList( final Context context)
	    {
	    	ArrayList<HashMap<String, Object>> list=new ArrayList<HashMap<String, Object>>();
	    	   try{            
	           // 这里获得的是正在运行的task,前一片blog获取的是进程,这里要注意,要获得task在manfist中要加上一个权限
                   //<uses-permission android:name="android.permission.GET_TASKS" />
                     List<RunningTaskInfo> runningTasks = am.getRunningTasks(100);  
	             for(int i=0;i<runningTasks.size();i++)
	             {
	            	 PackageInfo pInfo=new PackageInfo(context);
                        //如果取到null继续向下,否则就只能显示null之前的它task
                        if(runningTasks.get(i).topActivity.getPackageName()==null)
	            		 continue;
	            	//get application which is not in system and the usually 
	            	//if(pInfo.getInfo(runningTasks.get(i).topActivity.getPackageName()).equals(runningTasks.get(i).baseActivity.getPackageName()))
	            	{
	            		 String dir = pInfo.getInfo(runningTasks.get(i).topActivity.getPackageName()).publicSourceDir;
	            		 Float size=Float.valueOf((float) ((new File(dir).length()*1.0)));
	            		 //long date = new Date(new File(dir).lastModified()).getTime();
	            		 HashMap<String, Object> map=new HashMap<String, Object>();
	                	 map.put("icon", pInfo.getInfo(runningTasks.get(i).topActivity.getPackageName()).loadIcon(pm));  
	                	 map.put("name", pInfo.getInfo(runningTasks.get(i).topActivity.getPackageName()).loadLabel(pm));
	                	 if(size>1024*1024)
	                	 map.put("info", size/1024/1024+" MB");
	                	 else 
	                         map.put("info", size/1024+" KB");
	                	 map.put("packagename", runningTasks.get(i).topActivity.getPackageName().toString());
	                         list.add(map);
	            	}            	
	             }
	    	   }catch(Exception ex)
	    	   {}
	    	   SimpleAdapter listadapter=new SimpleAdapter(context, list, R.layout.task_list, new String[]{"icon","name","info"}, new int []{R.id.icon,R.id.name,R.id.info});
	   		   listView.setAdapter(listadapter);
	   		   listadapter.setViewBinder(new ViewBinder(){
	   		              public boolean setViewValue(View view,Object data,String textRepresentation){
	   		                  if(view instanceof ImageView && data instanceof Drawable){
	   		                      ImageView iv=(ImageView)view;
	   		                      iv.setImageDrawable((Drawable)data);
	   		                     return true;
	   		                 }
	   		                 else 
	   		                	 return false;
	   		             }
	   		         });
	   		   listView.setOnItemClickListener(new OnItemClickListener() {
				@Override
				public void onItemClick(AdapterView<?> parent, View view, int position,
						long id) {
					//get the item of the list to a hashmap
					HashMap<?, ?> map=(HashMap<?, ?>)parent.getItemAtPosition(position);
					//get package name from map
					String packageName=(String) map.get("packagename");
					//if we onclick the item then start the application
					Intent intent=new Intent();
					intent =pm.getLaunchIntentForPackage(packageName);
					context.startActivity(intent);
				}
			});
                               //长按事件中有所修改
                               listView.setOnItemLongClickListener(new OnItemLongClickListener() {

				@Override
				public boolean onItemLongClick(AdapterView<?> parent, View view,
						int position, long id) {
					final HashMap<?, ?> long_map=(HashMap<?, ?>)parent.getItemAtPosition(position);
					new AlertDialog.Builder(context).setTitle("Are you sure close the app")
					.setPositiveButton("sure", new OnClickListener() {						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							//ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
							String packageName=(String)long_map.get("packagename");
							PackageInfo pInfo=new PackageInfo(context);
							//base packagename to kill appliction
							List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
                                           //这里因为am.killBackgroundProcesses(packageName)和am.restartPackage(packageName)不能关闭程序
//所以用am.forceStopPackage(packageName),在manfist中添加<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>权限
//但是在ecplise中会报错,没有这个方法,没事,直接在源码中编译在源码中编译就不多说了,我前面的博客许多地方讲到了
                                          for(int i=0;i<runningAppProcesses.size();i++)
				             {    
				            	 if(pInfo.getInfo(runningAppProcesses.get(i).processName).packageName.equals(packageName))
							     {
				            		am.forceStopPackage(packageName);
							        //refash list
								     LoadList(context);
							     }
				             }
				           
						}
					}).setNegativeButton("cancle", new OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {						
						}
					}).show();
					return false;
				}
			});
	    }
}
class PackageInfo {
	 private List<ApplicationInfo> appList;  
   
	    public PackageInfo(Context context){  
	        //get all package data 
	        PackageManager pm = context.getApplicationContext().getPackageManager();  
	        appList = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); 
	    }  	      
	    public ApplicationInfo getInfo(String name){  
	        if(name == null){  
	            return null;  
	        }  
	        for(ApplicationInfo appInfo : appList){  
	            if(name.equals(appInfo.processName)){  
	                return appInfo;  
	            }  
	        }  
	        return null;  
	    }  
}

manfist文件:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.dialog.task"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Dialog_taskActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

其中用到的task_main.xml和task_list.xml文件都和前面一篇博客中一样,就不贴了。