次想法是根據上一片博客改進而來,爲了添加到framework中,基本代碼相同,但是有所修改。將activity修改成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文件都和前面一篇博客中一樣,就不貼了。