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>
图片:
文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。
原文链接:smilenicky.blog.csdn.net/article/details/49539105
- 点赞
- 收藏
- 关注作者
评论(0)