Android任务管理器的设计实现



项目结构如图,MyToast类是自定义的Toast类,MainActivity是主要Activity类

MainActivity.java:

package com.taskManager.activity;

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

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements Runnable , OnItemClickListener{

//Handler用来识别的标志
private static final int SEARCH_APP = 0;
private static final int DELETE_APP = 1;

GridView gv;
ListView lv;
//加载程序信息的List
private List<PackageInfo> packageInfo;
//存放手机所有程序信息的List
private List<PackageInfo> showPackageInfo;
//存放用户安装程序信息的List
private List<PackageInfo> userPackageInfo;

private ProgressDialog pd;
ImageButton ib_change_view;
ImageButton ib_change_category ;
private boolean allApplication = true;
private boolean isListView = false;
/**
* 程序一个Handler,用来接收进程传过来的信息
* 然后设置ListView和GridView的适配器
*/
private Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接收成功
if(msg.what == SEARCH_APP)
{
showPackageInfo = packageInfo;
lv.setAdapter(new ListViewAdapter(MainActivity.this,showPackageInfo));
gv.setAdapter(new GridViewAdapter(MainActivity.this,showPackageInfo));
pd.dismiss();
}
else if(msg.what == DELETE_APP){

}
}

};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除标题
requestWindowFeature(Window.FEATURE_NO_TITLE);

//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
findView();
initSettings();
}

/**
* 加载视图
*/
private void findView() {
gv = (GridView)this.findViewById(R.id.gv_apps);
lv = (ListView)this.findViewById(R.id.lv_apps);
pd = ProgressDialog.show(this,"温馨提示","加载中,请稍等...",true,false);
ib_change_category = (ImageButton)this.findViewById(R.id.ib_change_category);
ib_change_view = (ImageButton)this.findViewById(R.id.ib_change_view);
}

/**
* 初始化设置
*/
private void initSettings() {
Thread t = new Thread(this);
t.start();
ib_change_category.setOnClickListener(changeAppsCategory);
ib_change_view.setOnClickListener(changeListView);
gv.setOnItemClickListener(this);
lv.setOnItemClickListener(this);
}
//添加GridView ItemClick监听器
private GridView.OnItemClickListener gvItemClickListener = new GridView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
}
};
//ListView ItemClick监听器
private ListView.OnItemClickListener lvItemClickListener = new ListView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
}
};
//点击事件
private ImageButton.OnClickListener changeListView = new ImageButton.OnClickListener(){
@Override
public void onClick(View v) {
if(isListView){
MyToast.myToastShow(MainActivity.this, R.drawable.grids, "表格视图", Toast.LENGTH_SHORT);
ib_change_view.setImageResource(R.drawable.grids);
lv.setVisibility(View.GONE);
gv.setVisibility(View.VISIBLE);
isListView = false;
}
else {
MyToast.myToastShow(MainActivity.this, R.drawable.list, "列表视图", Toast.LENGTH_SHORT);
ib_change_view.setImageResource(R.drawable.list);
lv.setVisibility(View.VISIBLE);
gv.setVisibility(View.GONE);
isListView = true;
}
}

};
//点击事件
private ImageButton.OnClickListener changeAppsCategory = new ImageButton.OnClickListener(){
@Override
public void onClick(View v) {

if(allApplication){
ib_change_category.setImageResource(R.drawable.user);
showPackageInfo = userPackageInfo;
allApplication = false;
MyToast.myToastShow(MainActivity.this, R.drawable.user, "用户的APP", Toast.LENGTH_SHORT);
}
else{
MyToast.myToastShow(MainActivity.this, R.drawable.all, "所有的APP", Toast.LENGTH_SHORT);
ib_change_category.setImageResource(R.drawable.all);
showPackageInfo = packageInfo;
allApplication = true;
}
gv.setAdapter(new GridViewAdapter(MainActivity.this,showPackageInfo));
lv.setAdapter(new ListViewAdapter(MainActivity.this,showPackageInfo));
}
};

//GridView的适配器类
class GridViewAdapter extends BaseAdapter{

LayoutInflater inflater;
List<PackageInfo> pkInfo;
public GridViewAdapter(Context context,List<PackageInfo> packageInfos){
inflater = LayoutInflater.from(context);
this.pkInfo = packageInfos;
}
@Override
public int getCount() {
return pkInfo.size();
}

@Override
public Object getItem(int arg0) {
return pkInfo.get(arg0);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = inflater.inflate(R.layout.gv_item, null);
TextView tv = (TextView)view.findViewById(R.id.gv_item_appname);
ImageView iv =(ImageView) view.findViewById(R.id.gv_item_icon);
tv.setText(pkInfo.get(position).applicationInfo.loadLabel(getPackageManager()));
iv.setImageDrawable(pkInfo.get(position).applicationInfo.loadIcon(getPackageManager()));
return view;
}

}

//ListView的适配器类
class ListViewAdapter extends BaseAdapter{
LayoutInflater inflater;
List<PackageInfo> pkInfo;
public ListViewAdapter(Context context,List<PackageInfo> packageInfos){
inflater = LayoutInflater.from(context);
this.pkInfo = packageInfos;
}
@Override
public int getCount() {
return pkInfo.size();
}
@Override
public Object getItem(int arg0) {
return pkInfo.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = inflater.inflate(R.layout.list_item, null);
TextView tv_appName = (TextView)view.findViewById(R.id.lv_item_appname);
TextView tv_packageName = (TextView)view.findViewById(R.id.lv_item_packageame);
ImageView iv =(ImageView) view.findViewById(R.id.lv_icon);

tv_appName.setText(pkInfo.get(position).applicationInfo.loadLabel(getPackageManager()));
tv_packageName.setText(pkInfo.get(position).packageName);
iv.setImageDrawable(pkInfo.get(position).applicationInfo.loadIcon(getPackageManager()));
return view;
}
}

/**
* 开一个进程,用Handler来传送Message
*/
@Override
public void run() {
packageInfo = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES
| PackageManager.GET_ACTIVITIES);
userPackageInfo = new ArrayList<PackageInfo>();
for (int i =0;i<packageInfo.size();i++){
PackageInfo temp = packageInfo.get(i);
ApplicationInfo appInfo = temp.applicationInfo;
boolean flag = false;
//用户安装的程序
if((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
flag = true;
}
else if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) ==0){
flag = true;
}
if(flag){
userPackageInfo.add(temp);
}
}
//进程睡眠3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.sendEmptyMessage(SEARCH_APP);
try {
Thread.currentThread();
Thread.sleep(5000);
//用Handler传送Message
mHandler.sendEmptyMessage(DELETE_APP);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* ItemClick的处理
*/
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
final PackageInfo tempPkInfo = showPackageInfo.get(position);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选项");
builder.setItems(R.array.choice, new DialogInterface.OnClickListener(){

@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case 0:
showAppDetail(tempPkInfo);
break;
case 1:
ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
activityManager.killBackgroundProcesses(tempPkInfo.packageName);
MyToast.myToastShow(getApplicationContext(), R.drawable.manage, "成功关闭进程!", 1000);
break;
}

}

});
builder.setNegativeButton("取消", null);
builder.create();
builder.show();
}


/**
* Activity回传处理
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
packageInfo = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_ACTIVITIES);
userPackageInfo = new ArrayList<PackageInfo>();
for (int i =0;i<packageInfo.size();i++){
PackageInfo temp = packageInfo.get(i);
ApplicationInfo appInfo = temp.applicationInfo;
boolean flag = false;
//用户安装的程序
if((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
flag = true;
}
else if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) ==0){
flag = true;
}
if(flag){
userPackageInfo.add(temp);
}
}
if(allApplication){
showPackageInfo = packageInfo;
}
else{
showPackageInfo = userPackageInfo;
}
gv.setAdapter(new GridViewAdapter(MainActivity.this,showPackageInfo));
lv.setAdapter(new ListViewAdapter(MainActivity.this,showPackageInfo));
}

/**
*显示程序的详细详细
*/
private void showAppDetail(PackageInfo packageInfo) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("程序详细详细");
StringBuffer messageDetail = new StringBuffer();
messageDetail.append("程序名称: " + packageInfo.applicationInfo.loadLabel(getPackageManager()));
messageDetail.append("\n包名: " + packageInfo.packageName);
messageDetail.append("\n版本: " + packageInfo.versionName);
builder.setMessage(messageDetail);
builder.setIcon(packageInfo.applicationInfo.loadIcon(getPackageManager()));
builder.setPositiveButton("确定", null);
builder.create().show();
}

/**
* 回退按钮处理
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub

if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){
AlertDialog.Builder alertbBuilder=new AlertDialog.Builder(MainActivity.this);
alertbBuilder.setTitle("提示").setMessage("确认退出?").setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

MainActivity.this.finish();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();

}
}).create();
//显示提示框
alertbBuilder.show();
}
return super.onKeyDown(keyCode, event);
}
}


MyToast.java:

package com.taskManager.activity;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
/**
*
*自定义的Toast类
*/
public class MyToast {
public static void myToastShow(Context context,int imageResId,String content, int duration){
Toast toast = new Toast (context);
toast.setDuration(duration);
toast.setGravity(Gravity.BOTTOM, 0, 25);

LinearLayout toastLayout = new LinearLayout(context);
toastLayout.setOrientation(LinearLayout.HORIZONTAL);
toastLayout.setGravity(Gravity.CENTER_VERTICAL);
//设置Toast的图标
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
toastLayout.addView(imageView);
//设置Toast的Text
TextView tv_content = new TextView(context);
tv_content.setText(content);
tv_content.setBackgroundColor(Color.BLACK);

toastLayout.addView(tv_content);

toast.setView(toastLayout);

toast.show();

}
}



main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background = "#313849"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:layout_height = "28px"
android:layout_width = "fill_parent"
android:orientation ="horizontal"
android:gravity = "center_vertical"
android:paddingLeft = "5px"
android:background ="@drawable/top_bg"
>
<ImageView
android:layout_width = "18px"
android:layout_height ="18px"
android:src = "@drawable/manage"/>

<TextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:textColor = "#000"
android:textSize= "14px"
android:paddingLeft = "10px"
android:paddingTop = "5px"
android:text = "任务管理器 v1.0.0"/>
</LinearLayout>

<GridView android:id="@+id/gv_apps"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:numColumns = "3"
android:horizontalSpacing = "10px"
android:verticalSpacing = "10px"
android:listSelector = "@drawable/choose_gridview"
android:layout_marginLeft = "5px"
android:layout_marginTop = "28px"
android:layout_marginBottom = "58px"
android:layout_marginRight = "5px"/>
<ListView
android:id="@+id/lv_apps"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/choose_listview"
android:layout_marginTop="28px"
android:layout_marginBottom="58px"
android:layout_marginLeft="5px"
android:layout_marginRight="5px"
android:visibility="gone"
>
</ListView>
<RelativeLayout
android:layout_width = "fill_parent"
android:layout_height ="58px"
android:layout_alignParentBottom = "true"
android:background = "@drawable/bottom_bg"
>
<ImageButton
android:id="@+id/ib_change_view"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5px"
android:layout_marginTop="1px"
android:src="@drawable/list"
android:layout_width="76px"
android:layout_height="54px"/>
<ImageButton
android:id="@+id/ib_change_category"
android:layout_alignParentRight="true"
android:layout_marginRight="5px"
android:layout_marginTop="1px"
android:src="@drawable/all"
android:layout_width="76px"
android:layout_height="54px"/>
</RelativeLayout>

</RelativeLayout>


list_item.xml:

<?xml version="1.0" encoding="utf-8"?>

<!--
整体是一个LinearLayout,
1、布局方向为水平布局,
2、宽fill_parent
3、高wrap_content
4、内容的方向垂直居中
5、ImageView
a)Id为lv_icon
b)距离父控件的顶部和底部都是5px
c)宽、高48px
6、LinearLayout
a)布局方向为垂直布局
b)宽wrap_content
c)高48px
d)左边预留5px的距离
e)TextView
i.Id为lv_item_appname
ii.宽fill_parent
iii.高wrap_content
iv.单行显示
v.字体大小16px
vi.字体样式:加粗
vii.字体颜色:#fff
f)TextView
i.Id为lv_item_packagenam
ii.宽fill_parent
iii.高wrap_content
iv.单行显示
v.字体颜色#fff
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_vertical">

<ImageView
android:id="@+id/lv_icon"
android:layout_width="48px"
android:layout_height="48px"
android:layout_marginTop="5px"
android:layout_marginBottom="5px"
></ImageView>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="48px"
android:paddingLeft="5px"
>
<TextView
android:id="@+id/lv_item_appname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textSize="16px"
android:textStyle="bold"
android:textColor="#fff"
></TextView>

<TextView
android:id="@+id/lv_item_packageame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="#fff"
></TextView>


</LinearLayout>
</LinearLayout>


gv_item.xml:

<?xml version="1.0" encoding="utf-8"?>

<!--

a) LinearLayout i. 高:wrap_content ii. 宽:90px iii. 布局方向:垂直 iv.
设置里面的控件的位置为中间 v. ImageView 1. 设置id为gv_item_icon 2. 宽高都为64px vi.
TextView 1. 设置id为gv_item_appname 2. 宽高都为wrap_content 3. 设置为2行 4.
字体大小16px 5. 颜色#FFF
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="90px"
android:layout_height="wrap_content" android:gravity="center">

<ImageView android:id="@+id/gv_item_icon"
android:layout_width="64px" android:layout_height="64px">
</ImageView>
<TextView android:id="@+id/gv_item_appname"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:lines="2" android:textSize="16px" android:textColor="#FFF" />
</LinearLayout>


string.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, AppExplorer!</string>
<string name="app_name">安卓任务管理器</string>
<array name="choice">
<item name="detail">详细信息</item>
<item name="close">关闭进程</item>
</array>
</resources>


AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.taskManager.activity"
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.GET_PACKAGE_SIZE"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".MainActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

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

</manifest>


图片:











据国外研究公司统计,在2008年全球个人计算机用户已经超过10亿,并预测在2010年全球个人计算机用户数量将超过13亿。随着个人计算机走进千家万户,计算机操作系统中的任务管理器也被越来越多的用户所熟悉和使用。 任务管理器是在Windows系统中管理应用程序和进程的工具,通常由Windows操作系统自带,也有提供增强功能的第三方软件。通过任务管理器用户可以方便的查看当前运行的程序、进程、用户、网络连接以及系统对内存和CPU的资源占用,并可以强制结束某些程序和进程,此外还可以监控系统资源的使用状况。 Windows 任务管理器首次出现是在1998年美国微软公司发行的Windows98操作系统中,此后微软的各个版本的Windows操作系统都集成了任务管理器任务管理器并不是Windows系统的专利,它广泛运用于各种操作系统中,在苹果公司的Mac OS 操作系统中有类似的活动监视器(Activity Monitor),在基于Linux的ubuntu操作系统有相类似功能的系统监视器。 Windows任务管理器提供了有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的。它的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,其下还有应用程序、进程、性能、联网、用户等五个标签页。 课题设计就是模拟Windows任务管理器,开发的一个Windows进程管理软件。主要设计的是一个基于窗体的C#程序,在主对话框上面放置了一个标签控件,并创建了应用程序、进程和性能三个页面,标签控件用于选择并显示页面。三个页面分别用于显示当前运行的窗口程序、进程及进程模块、系统资源使用情况。程序还实现了结束任务、等对进程管理的基本功能。在的设计过程中,通过调用Windows API函数而获得任务、进程、线程模块,以及系统资源使用情况等信息。最后在Windows10系统上进行测试,实现了进程管理的基本功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值