package com.insthub.BeeFramework.activity;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.text.format.Formatter;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.insthub.ecmobile.R;
import com.insthub.BeeFramework.model.BeeCallback;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/*
* ______ ______ ______
* /\ __ \ /\ ___\ /\ ___\
* \ \ __< \ \ __\_ \ \ __\_
* \ \_____\ \ \_____\ \ \_____\
* \/_____/ \/_____/ \/_____/
*
*
* Copyright (c) 2013-2014, {Bee} open source community
* http://www.bee-framework.com
*
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
@SuppressLint("NewApi")
public class MemoryMessageActivity extends BaseActivity {
private TextView memory_total;
private TextView memory_avail;
private TextView memory_low;
private TextView pid;
private TextView uid;
private TextView memSize;
private TextView processName;
private TextView networkUsage;
private LinearLayout view;
private Timer timer;
private ActivityManager mActivityManager = null ;
private List<Integer> list = new ArrayList<Integer>();
private int _memSize;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.memory_message);
memory_total = (TextView) findViewById(R.id.memory_total);
memory_avail = (TextView) findViewById(R.id.memory_avail);
memory_low = (TextView) findViewById(R.id.memory_low);
pid = (TextView) findViewById(R.id.memory_pid);
uid = (TextView) findViewById(R.id.memory_uid);
memSize = (TextView) findViewById(R.id.memory_memSize);
processName = (TextView) findViewById(R.id.memory_processName);
networkUsage = (TextView)findViewById(R.id.network_usage);
view = (LinearLayout) findViewById(R.id.memory_view);
mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
setContent();
for(int i=0;i<9;i++) {
list.add(_memSize);
}
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
};
timer.schedule(timerTask, 1000, 1000);
MyView myView = new MyView(this);
view.addView(myView);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what) {
case 1:
setContent();
view.removeAllViews();
MyView myView = new MyView(MemoryMessageActivity.this);
view.addView(myView);
break;
}
}
};
public void setContent() {
MemoryInfo memoryInfo = new MemoryInfo() ;
mActivityManager.getMemoryInfo(memoryInfo) ;
Resources resource = (Resources) getBaseContext().getResources();
String mot=resource.getString(R.string.memorymessagemctivity_motalram );
String fre=resource.getString(R.string.memorymessageactivity_freeram);
String low=resource.getString(R.string.memorymessageactivity_lowram);
String rat=resource.getString(R.string.memorymessageactivity_rate);
memory_total.setText(mot +formateFileSize(memoryInfo.totalMem));
memory_avail.setText(fre+formateFileSize(memoryInfo.availMem));
memory_low.setText(low+memoryInfo.lowMemory);
networkUsage.setText(rat+ BeeCallback.averageBandwidthUsedPerSecond);
getRunningAppProcessInfo();
}
private void getRunningAppProcessInfo() {
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();
for(int i=0;i < appProcessList.size();i++) {
if(appProcessList.get(i).processName.equals("com.BeeFramework.example")) {
int _pid = appProcessList.get(i).pid;
// 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
int _uid = appProcessList.get(i).uid;
// 进程名,默认是包名或者由属性android:process=""指定
String _processName = appProcessList.get(i).processName;
// 获得该进程占用的内存
int[] myMempid = new int[] { _pid };
// 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(myMempid);
// 获取进程占内存用信息 kb单位
_memSize = memoryInfo[0].dalvikPrivateDirty;
Resources resource = (Resources) getBaseContext().getResources();
String proid=resource.getString(R.string.memorymessageactivity_id );
String puid=resource.getString(R.string.memorymessageactivity_uid );
String mem=resource.getString(R.string.memorymessageactivity_mem );
String pro=resource.getString(R.string.memorymessageactivity_process );
String rat=resource.getString(R.string.memorymessageactivity_rate);
pid.setText(proid+_pid);
uid.setText(puid+_uid);
memSize.setText(mem+_memSize+"k");
processName.setText(pro+_processName);
networkUsage.setText(rat+ BeeCallback.averageBandwidthUsedPerSecond);
list.add(_memSize);
if(list.size() >= 10) {
list.remove(0);
}
break;
}
}
}
private String formateFileSize(long size){
return Formatter.formatFileSize(this, size);
}
@Override
public void onDestroy() {
super.onDestroy();
timer.cancel();
}
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);// 重写onDraw方法
canvas.drawColor(Color.WHITE);// 设置背景颜色
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);// 去锯齿
paint.setColor(Color.BLUE);// 颜色
Paint paint1 = new Paint();
paint1.setStyle(Paint.Style.STROKE);
paint1.setAntiAlias(true);// 去锯齿
paint1.setColor(Color.parseColor("#c4c4c4c4"));
// 数据 线
int x = 0;
int[] y = new int[100];
y[0] = 650;
for (int i = 0; i < list.size(); i++) {
y[i+1] = 650 - list.get(i) * 50 / 1024;
x = x + 50;
int x2 = x + 50;
if(i!=0) {
canvas.drawLine(x, y[i], x2, y[i+1], paint);
}
canvas.drawCircle(x2, y[i+1], 2, paint);
}
// 设置Y轴
canvas.drawLine(100, 50, 100, 650, paint);
canvas.drawLine(100, 100, 105, 100, paint);
canvas.drawLine(100, 150, 105, 150, paint);
canvas.drawLine(100, 200, 105, 200, paint);
canvas.drawLine(100, 250, 105, 250, paint);
canvas.drawLine(100, 300, 105, 300, paint);
canvas.drawLine(100, 350, 105, 350, paint);
canvas.drawLine(100, 400, 105, 400, paint);
canvas.drawLine(100, 450, 105, 450, paint);
canvas.drawLine(100, 500, 105, 500, paint);
canvas.drawLine(100, 550, 105, 550, paint);
canvas.drawLine(100, 600, 105, 600, paint);
// 设置X轴
canvas.drawLine(100, 650, 550, 650, paint);
canvas.drawLine(150, 650, 150, 645, paint);
canvas.drawLine(200, 650, 200, 645, paint);
canvas.drawLine(250, 650, 250, 645, paint);
canvas.drawLine(300, 650, 300, 645, paint);
canvas.drawLine(350, 650, 350, 645, paint);
canvas.drawLine(400, 650, 400, 645, paint);
canvas.drawLine(450, 650, 450, 645, paint);
canvas.drawLine(500, 650, 500, 645, paint);
// 绘制表格
// y轴平行线
canvas.drawLine(150, 50, 150, 650, paint1);
canvas.drawLine(200, 50, 200, 650, paint1);
canvas.drawLine(250, 50, 250, 650, paint1);
canvas.drawLine(300, 50, 300, 650, paint1);
canvas.drawLine(350, 50, 350, 650, paint1);
canvas.drawLine(400, 50, 400, 650, paint1);
canvas.drawLine(450, 50, 450, 650, paint1);
canvas.drawLine(500, 50, 500, 650, paint1);
canvas.drawLine(550, 50, 550, 650, paint1);
// x轴平行线
canvas.drawLine(100, 600, 550, 600, paint1);
canvas.drawLine(100, 550, 550, 550, paint1);
canvas.drawLine(100, 500, 550, 500, paint1);
canvas.drawLine(100, 450, 550, 450, paint1);
canvas.drawLine(100, 400, 550, 400, paint1);
canvas.drawLine(100, 350, 550, 350, paint1);
canvas.drawLine(100, 300, 550, 300, paint1);
canvas.drawLine(100, 250, 550, 250, paint1);
canvas.drawLine(100, 200, 550, 200, paint1);
canvas.drawLine(100, 150, 550, 150, paint1);
canvas.drawLine(100, 100, 550, 100, paint1);
canvas.drawLine(100, 50, 550, 50, paint1);
// 设置Y轴文字
paint.setTextSize(20);
canvas.drawText("0", 80, 665, paint);
canvas.drawText("1", 80, 605, paint);
canvas.drawText("2", 80, 555, paint);
canvas.drawText("3", 80, 505, paint);
canvas.drawText("4", 80, 455, paint);
canvas.drawText("5", 80, 405, paint);
canvas.drawText("6", 80, 355, paint);
canvas.drawText("7", 80, 305, paint);
canvas.drawText("8", 80, 255, paint);
canvas.drawText("9", 80, 205, paint);
canvas.drawText("10", 70, 155, paint);
canvas.drawText("11", 70, 105, paint);
canvas.drawText("千k", 70, 55, paint);
// // 设置X轴文字
// canvas.drawText("1", 145, 670, paint);
// canvas.drawText("2", 195, 670, paint);
// canvas.drawText("3", 245, 670, paint);
// canvas.drawText("4", 295, 670, paint);
// canvas.drawText("5", 345, 670, paint);
// canvas.drawText("6", 395, 670, paint);
// canvas.drawText("7", 445, 670, paint);
// canvas.drawText("8", 495, 670, paint);
// canvas.drawText("千k", 555, 670, paint);
}
}
}