最新实战教程,让你了解Android自动化刷量、作弊与防作弊的那些事,案例:刷友盟统计、批量注册苹果帐号
昨天, 我们已经把程序锁这个功能给完成了,那么今天,我们就来做一下进程管理的功能,其实就是通过一个ActivityManager的对象来获取到这些信息的,所以也是挺简单的。
那么我们现在就来写一下这些代码。
首先,我们先来回顾一下我们之前说的,自定义title,我们是通过隐藏系统自己的title,然后再布局文件里面增加一些控件来达到自定义title的作用的,那么今天我们就讲一下另一种自定义title的方式。
// 请求一个自己定义的title,但有一些Android系统是被修改过的, // 所以有可能是无法请求的,如乐Phone或小米的手机,这些系统是被修改过的, // 所以就要判断一下是否请求成功 boolean flags = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.process_manager); if (flags) { // 设置自定义的title getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.process_manager_title); }
大家可以看到,我们就是通过下面的几行代码来进行自定义title的,那么现在我们就学会了两种自定义title的方法啦,大家可以根据自己的需要来选择使用
上面只是设置好那个定义的代码,我们还要设置一下它的样式,不然就会只有25dip的啦,如何知道应该怎样设置这些值呢,我们之前讲过的,如果有什么不明白的,可以回去看我们之前的文章(自定义对话框),那么我们自定义title要修改的值也就只有两个啦
我们主要修改的也就是上面选定了的内容而已,所以我们现在在我们的style.xml里面写上几句样式
sytle.xml
<style name="MyTitleBar" parent="@android:style/Theme"> <item name="android:windowTitleSize">40dip</item> <item name="android:windowTitleBackgroundStyle">@drawable/title_background</item> </style>
那么我们写好了这些style就要应用它啦,那么我们是在那里应用它呢,就是在我们的activity的声明的时候啦,也就是在AndroidMainfest文件里面应用我们的style啦
AndroidMainfest.xml
<activity android:theme="@style/MyTitleBar" android:label="@string/process_manager" android:name="com.xiaobin.security.ui.ProcessManagerActivity"></activity>
就这样子,我们的另一种自定义title就完成的啦,现在我们可以先给大家看看效果啦
好啦,上面的效果和我们隐藏自带的title, 然后自己用控件来实现差不多,大家可以根据自己的需要来选择实现方式
那么接下来,我们就要讲一下我们今天的主要内容啦,今天我们就是要把手机里面已经运行了的应用数目,以及手机里面剩余的内存数目啦
其实要拿到手机里面已经运行了的进程数目也很简单,只要我们拿到一个activityManager对象,然后再调用它的一个方法就可以的了
//拿到当前运行的进程数目 private int getRunningAppCount() { runningAppProcessInfos = activityManager.getRunningAppProcesses(); return runningAppProcessInfos.size(); }
activityManager.getRunningAppProcesses()拿到的是一个List<RunningAppProcessInfo>的列表,也就是运行的进程的信息的对象了,所以只要知道这个list里面有多少个对象,就可以知道有多少个进程在运行啦
拿到剩余的内存也比较简单,也是通过activityManager来获取的
//拿到系统剩余的内存 private String getAvailMemory() { //new一个内存的对象 MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); //拿到现在系统里面的内存信息 activityManager.getMemoryInfo(memoryInfo); //拿到有效的内存空间 long size = memoryInfo.availMem; return TextFormater.dataSizeFormat(size); }
大家可以看到,我们上面用了一个TextFormater的类,这个类是我们用来转换单位的啦
com.xiaobin.security.utils.TextFormater
package com.xiaobin.security.utils; import java.text.DecimalFormat; public class TextFormater { public static String dataSizeFormat(long size) { DecimalFormat formater = new DecimalFormat("####.00"); if(size < 1024) { return size + "byte"; } else if(size < (1 << 20)) //左移20位,相当于1024 * 1024 { float kSize = size >> 10; //右移10位,相当于除以1024 return formater.format(kSize) + "KB"; } else if(size < (1 << 30)) //左移30位,相当于1024 * 1024 * 1024 { float mSize = size >> 20; //右移20位,相当于除以1024再除以1024 return formater.format(mSize) + "MB"; } else if(size < (1 << 40)) { float gSize = size >> 30; return formater.format(gSize) + "GB"; } else { return "size : error"; } } }
好啦,到这里为止,我们的读取进程数目与读取剩余内存的数目就讲完的啦,下面我们把完整的activity和布局文件粘出来
com.xiaobin.security.ui.ProcessManagerActivity
package com.xiaobin.security.ui; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; import android.os.Bundle; import android.view.Window; import android.widget.TextView; import com.xiaobin.security.R; import com.xiaobin.security.utils.TextFormater; public class ProcessManagerActivity extends Activity { private TextView tv_process_count; private TextView tv_process_memory; private ActivityManager activityManager; private List<RunningAppProcessInfo> runningAppProcessInfos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); // 请求一个自己定义的title,但有一些Android系统是被修改过的, // 所以有可能是无法请求的,如乐Phone或小米的手机,这些系统是被修改过的, // 所以就要判断一下是否请求成功 boolean flags = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.process_manager); if (flags) { // 设置自定义的title getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.process_manager_title); } tv_process_count = (TextView) findViewById(R.id.tv_process_count); tv_process_memory = (TextView) findViewById(R.id.tv_process_memory); initTitle(); } //拿到当前运行的进程数目 private int getRunningAppCount() { runningAppProcessInfos = activityManager.getRunningAppProcesses(); return runningAppProcessInfos.size(); } //拿到系统剩余的内存 private String getAvailMemory() { //new一个内存的对象 MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); //拿到现在系统里面的内存信息 activityManager.getMemoryInfo(memoryInfo); //拿到有效的内存空间 long size = memoryInfo.availMem; return TextFormater.dataSizeFormat(size); } //设置title的信息 private void initTitle() { tv_process_count.setText("进程数目:" + getRunningAppCount()); tv_process_memory.setText("剩余内存:" + getAvailMemory()); } }
process_manager.xml
<?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="@android:color/white" android:orientation="vertical" > </LinearLayout>
process_manager_title.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dip" android:gravity="center_vertical" android:background="@drawable/title_background" > <TextView android:id="@+id/tv_process_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:textColor="@android:color/white" android:text="@string/process_count"/> <TextView android:id="@+id/tv_process_memory" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dip" android:textColor="@android:color/white" android:text="@string/process_memory"/> </RelativeLayout>
好啦,今天就讲到这里啦,接下来,我们都会讲这个进程管理的内容的啦
最后,和大家说一下
为了方便大家的交流,我创建了一个群,这样子大家有什么疑问也可以在群上交流
群号是298440981