android Dialog布局显示已打开的应用程序
2012-12-21 09:09
274 查看
次想法是根据上一片博客改进而来,为了添加到framework中,基本代码相同,但是有所修改。将activity修改成Dialog布局的形式将已经打开的程序显示出来。
看一下大概图片吧:
首先用一个activity来显示一个button,为button添加点击事件,这个点击事件就是弹出dialog布局显示已经打开的程序,并可以实现点击回复程序所在页面,
以及长按关闭程序,activity代码:
main.xml
再看看Dialog布局实现的功能:
代码有所改动,改动地方我会注释
manfist文件:
其中用到的task_main.xml和task_list.xml文件都和前面一篇博客中一样,就不贴了。
看一下大概图片吧:
首先用一个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文件都和前面一篇博客中一样,就不贴了。
相关文章推荐
- Android:打开相册(动态布局,Activity以dialog方式显示,图片压缩)
- Android 硬菜之圆角Dialog显示自定义布局(无棱角)
- Android自定义Dialog布局listview 实现显示安装的应用
- android应用程序布局时选择皮肤和设置横屏、全屏显示的方法
- (布局)Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
- android实现应用程序只有在第一次启动时显示引导界面 ,以后就不在显示
- Android-打开系统相机并拍照两种显示方式。
- Android 中布局设置导致的TextView不显示的问题
- 调整android dialog对话框显示位置
- Android一点 ListView显示多种布局
- android之利用activity进行弹窗dialog显示版本更新
- Android 自定义对话框(Dialog)设置显示大小方向
- Android AlertDialog添加布局文件
- android的activity或dialog位置大小动态显示
- Android非常简单的使应用程序全屏显示
- Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
- 解决Android 7.0中 Android Device Monitor(DDMS)的 File Explorer不显示目录树及data目录无法打开的问题
- android应用程序安装后点击打开带来的问题
- Android 应用程序窗体显示状态操作
- android gridview布局,实现长按某一个,所有项都显示删除的图标