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

Android进程管理之布局代码和activity

2016-07-11 09:19 423 查看
首先是布局代码;布局代码分为主活动的布局和listview item布局,下面介绍主活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical" >

<TextView
style="@style/text_title_style"
android:text="任 务 管 理@Yq" />

<View style="@style/view_divide_line_style" />

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip" >

<TextView
android:id="@+id/tv_task_manager_task_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="进程数:0" />

<TextView
android:id="@+id/tv_task_manager_task_memory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="可用/总内存:50MB/700MB" />
</RelativeLayout>

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="0dip"
android:background="#CCCC99"
android:layout_weight="1"
>

<ListView
android:id="@+id/lv_taskmanage"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="#fff"
android:dividerHeight="1.0dip"
android:fastScrollEnabled="true"
android:paddingLeft="3.0dip"
android:paddingRight="3.0dip" />

<RelativeLayout
android:id="@+id/rl_loading"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical" >

<ProgressBar
android:id="@+id/pb"
style="?android:attr/horizontalDivider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:text="正在加载应用程序..."
android:textColor="#fff"
android:textSize="22sp" />
</LinearLayout>
</RelativeLayout>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">

<Button
android:id="@+id/clean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="kill_process"
android:text="一键清理"/>

<Button
android:id="@+id/set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="程序设置"/>
</LinearLayout>
</LinearLayout>


主活动布局中包含当前进程数量的文本组件,系统总内存,当前可用内存文本组件,用于显示进程列表的listview ,底部包含两个按钮;一键清理和设置

listview item布局如下;

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="8.0dip"
android:paddingLeft="6.0dip"
android:paddingRight="5.0dip"
android:paddingTop="8.0dip" >

<ImageView
android:id="@+id/iv_task_manager_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />

<TextView
android:id="@+id/tv_task_manager_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4.0dip"
android:layout_toRightOf="@id/iv_task_manager_icon"
android:textColor="#FF0033"
android:textSize="15sp" />

<TextView
android:id="@+id/tv_task_manager_memory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_task_manager_name"
android:layout_toRightOf="@id/iv_task_manager_icon"
android:text="占用内存:20KB"
android:textColor="#000000"
android:textSize="15sp" />
<!-- 注意在checkbox 添加了两个属性 让其 不能被选中 不获取焦点  -->
<CheckBox
android:id="@+id/cb_task_manager_selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="false"
android:focusable="false" />

</RelativeLayout>


item 的布局中主要就是图片组件和两个文本组件,一个勾选框 分别用来显示进程图标,包名,进程名,点击勾选用于一键清除进程

下面是activity代码,适配器没有进行封装

public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
protected static final int SUCCESS_GETTASKINFO = 0;
private TextView task_count;
private TextView task_memory;
private ListView task_manage_list;
private RelativeLayout rl_loading;
private ProgressBar pb;
private Button clean;
private Button set;
private List<TaskInfo> taskinfos;
private TaskAdapter adapter;
private static final int ALL_SELECTED_ID = 1;
private static final int CANCEL_SELECTED_ID = 2;
private static final int UPDATE = 3;
private ActivityManager am;
private Handler mhandler = new Handler() {

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.what == SUCCESS_GETTASKINFO) {
long total = TaskUtils.getAvailMem(MainActivity.this);
for (TaskInfo info : taskinfos) {
total += info.getTask_memory() * 1024;
}
// 可用内存
String availMemStr = TextFormat.formatByte(TaskUtils.getAvailMem(MainActivity.this));
// 总内存
String totalMemStr = TextFormat.formatByte(total);
task_memory.setText("可用/总内存=" + availMemStr + "/" + totalMemStr);

adapter = new TaskAdapter(taskinfos);
task_manage_list.setAdapter(adapter);
rl_loading.setVisibility(View.GONE);
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "主线程的 task ID " + getTaskId() + "主线程线程ID " + Thread.currentThread().getId());
task_count = (TextView) findViewById(R.id.tv_task_manager_task_count);
task_memory = (TextView) findViewById(R.id.tv_task_manager_task_memory);
task_manage_list = (ListView) findViewById(R.id.lv_taskmanage);
rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);
pb = (ProgressBar) findViewById(R.id.pb);
clean = (Button) findViewById(R.id.clean);
set = (Button) findViewById(R.id.set);
clean.setOnClickListener(this);
set.setOnClickListener(this);
am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
// 获取activitymanager服务 得到进程数量
int size = TaskUtils.getRunningAppProcessInfoSize(MainActivity.this);
task_count.setText("进程数:" + size);
new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
// 获取运行进程列表
taskinfos = TaskUtils.getTaskInfos(MainActivity.this);
Message msg = new Message();
// 给消息设置标志位
msg.what = SUCCESS_GETTASKINFO;
mhandler.sendMessage(msg);
}
}).start();
///////////
task_manage_list.setOnItemClickListener(new MyOnItemClickListener());
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();

}

public void kill_process() {
List<TaskInfo> newTaskInfo = new ArrayList<TaskInfo>();
for (final TaskInfo taskInfo : taskinfos) {
if (taskInfo.isChecked()) {
// 杀死选中的进程
new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
am.killBackgroundProcesses(taskInfo.getPackageName());
}
}).start();

} else {
newTaskInfo.add(taskInfo);
}
}
// 通知跟新
adapter.setTaskInfos(newTaskInfo);
adapter.notifyDataSetChanged();

}

public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.clean:
kill_process();
// taskinfos = TaskUtils.getTaskInfos(MainActivity.this);
adapter.notifyDataSetChanged();
for (TaskInfo info : taskinfos) {
info.setChecked(false);
}
break;
case R.id.set:

break;
default:
break;
}

}

public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
// 创建上下文菜单
menu.add(0, ALL_SELECTED_ID, 0, "全选");
menu.add(0, CANCEL_SELECTED_ID, 0, "取消选择");
menu.add(0, UPDATE, 0, "刷新");
return super.onCreateOptionsMenu(menu);
}

public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
// 处理菜单事件
int id = item.getItemId();
switch (id) {
case ALL_SELECTED_ID:
for (TaskInfo info : taskinfos) {
if (!info.getPackageName().equals(getPackageName())) {
info.setChecked(true);
}
}
// 通知更新
adapter.notifyDataSetChanged();
break;
case CANCEL_SELECTED_ID:
for (TaskInfo info : taskinfos) {
info.setChecked(false);
}
adapter.notifyDataSetChanged();
break;
case UPDATE:
List<TaskInfo>   taskInfos2=new ArrayList<TaskInfo>();
taskInfos2=TaskUtils.getTaskInfos(MainActivity.this);
adapter.setTaskInfos(taskInfos2);

adapter.notifyDataSetChanged();
break;
default:
break;
}

return super.onOptionsItemSelected(item);
}

private class MyOnItemClickListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
// 注意下面这个获取tag的写法
CheckBox checkBox = ((ViewHolder) view.getTag()).checked;
TaskInfo taskInfo = (TaskInfo) adapter.getItem(position);
// 如果是自身应用程序,则直接不执行下面的操作
if (taskInfo.getPackageName().equals(getPackageName())) {
return; // 如果是当前程序 则不执行下面的代码 ???????????
}
// 如果 item里的taskinfo 已经处于选中状态 则取消选择 反之
if (taskInfo.isChecked()) {
taskInfo.setChecked(false);
checkBox.setChecked(false);
} else {
taskInfo.setChecked(true);
checkBox.setChecked(true);
}

}

}

// 给listview设置适配器
class TaskAdapter extends BaseAdapter {
List<TaskInfo> taskInfos;
TaskInfo taskInfo;

public TaskAdapter(List<TaskInfo> taskInfos) {
this.taskInfos = taskInfos;
// TODO Auto-generated constructor stub
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return taskInfos.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return taskinfos.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
taskInfo = taskInfos.get(position);
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.task_manager_item, null);
holder.icon = (ImageView) convertView.findViewById(R.id.iv_task_manager_icon);
holder.name = (TextView) convertView.findViewById(R.id.tv_task_manager_name);
holder.memory = (TextView) convertView.findViewById(R.id.tv_task_manager_memory);
holder.checked = (CheckBox) convertView.findViewById(R.id.cb_task_manager_selected);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.icon.setImageDrawable(taskInfos.get(position).getTask_icon());
// 在进程信息中 设置进程包名 任务名称 进程号
String packageName = taskInfos.get(position).getPackageName();
// equals() 里面的getPackageName() 来自contextwrapper
if (packageName.equals(getPackageName())) {
// 如果是当前应用程序 就将选择框设置隐藏
holder.checked.setVisibility(View.GONE);
} else {
holder.checked.setVisibility(View.VISIBLE);
}
holder.name.setText(taskInfos.get(position).getPackageName() + taskInfos.get(position).getTask_name()
+ taskInfos.get(position).getPid());
holder.memory.setText(TextFormat.formatByte(taskInfos.get(position).getTask_memory()));
// 获取item的 选中转态
boolean isChecked = taskInfo.isChecked();
holder.checked.setChecked(isChecked);
return convertView;
}

public List<TaskInfo> getTaskInfos() {
return taskInfos;
}

public void setTaskInfos(List<TaskInfo> taskInfos) {
this.taskInfos = taskInfos;
}

}

class ViewHolder {
ImageView icon;
TextView name;
TextView memory;
CheckBox checked;

public CheckBox getChecked() {
return checked;
}

public void setChecked(CheckBox checked) {
this.checked = checked;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: