您的位置:首页 > 移动开发 > Android开发

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

2012-12-21 09:09 274 查看
次想法是根据上一片博客改进而来,为了添加到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文件都和前面一篇博客中一样,就不贴了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: