Android进程管理之布局代码和activity
2016-07-11 09:19
423 查看
首先是布局代码;布局代码分为主活动的布局和listview item布局,下面介绍主活动布局
主活动布局中包含当前进程数量的文本组件,系统总内存,当前可用内存文本组件,用于显示进程列表的listview ,底部包含两个按钮;一键清理和设置
listview item布局如下;
item 的布局中主要就是图片组件和两个文本组件,一个勾选框 分别用来显示进程图标,包名,进程名,点击勾选用于一键清除进程
下面是activity代码,适配器没有进行封装
<?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; } } }
相关文章推荐
- Android打开.pgm图片
- Volley的使用以及源码分析(二)
- Volley的使用以及源码分析(一)
- Android进程管理之taskinfo模型
- Android进程管理之数据格式化类TextFormat
- Android进程管理之工具类taskutils
- Android Studio 快捷键
- Android第三十天
- Android第二十九天
- android环境下两种md5加密方式
- Android 四大组件 五大布局
- android Base64加密解密
- Android Bitmap
- 安卓中关于Shareprence
- Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
- Android的Selector 应用详解
- 老生常谈 activity 启动模式
- Android的独白
- Android应用A启动应用B的某个Activity
- Android开发——Retrofit2.0 工具类