首先获取手机上安装的所有应用,过滤掉系统原装应用,对用户自装的软件进行判断,保留有网络权限的应用,再根据TrafficStats
得到每个应用使用的流量大小。
FlowDataActivity.java
public class FlowDataActivity extends AppCompatActivity {
ListView listView;
private List<HashMap<String,Object>> hashMapList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_flow_data);
getAppTrafficList();
initView();
initData();
}
private void initView() {
listView = (ListView) findViewById(R.id.flowList);
}
private void initData() {
listView.setAdapter(new FlowDataAdapter(hashMapList,this));
}
public void getAppTrafficList(){
//获取所有的安装在手机上的应用软件的信息,并且获取这些软件里面的权限信息
PackageManager pm=getPackageManager();//获取系统应用包管理
//获取每个包内的androidmanifest.xml信息,它的权限等等
List<PackageInfo> pinfos=pm.getInstalledPackages
(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);
//遍历每个应用包信息
hashMapList = new ArrayList<>();
for(PackageInfo info:pinfos){
//以下是用户自装应用
if((info.applicationInfo.flags& ApplicationInfo.FLAG_SYSTEM)==0)
{
//请求每个程序包对应的androidManifest.xml里面的权限
String[] premissions=info.requestedPermissions;
if(premissions!=null && premissions.length>0){
//找出需要网络服务的应用程序
for(String premission : premissions){
if("android.permission.INTERNET".equals(premission)){
//获取每个应用程序在操作系统内的进程id
HashMap<String,Object> hashmap = new HashMap<>();
int uId=info.applicationInfo.uid;
//如果返回-1,代表不支持使用该方法,注意必须是2.2以上的
long rx= TrafficStats.getUidRxBytes(uId);
//如果返回-1,代表不支持使用该方法,注意必须是2.2以上的
long tx=TrafficStats.getUidTxBytes(uId);
if(rx<0 || tx<0){
continue;
}else{
hashmap.put("appImage",info.applicationInfo.loadIcon(pm));
hashmap.put("appName",info.applicationInfo.loadLabel(pm));
hashmap.put("appFlowData", Formatter.formatFileSize(this, rx+tx));
hashMapList.add(hashmap);
}
}
}
}
}
}
}
}
当前主界面的布局文件activity_flow_data.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="match_parent"
>
<ListView
android:id="@+id/flowList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
</RelativeLayout>
列表的布局文件list_flow_data.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="wrap_content"
>
<ImageView
android:id="@+id/appImage"
android:layout_width="50dp"
android:layout_height="50dp"/>
<TextView
android:id="@+id/appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/appImage"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/appFlowData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
adapter适配器的内容 FlowDataAdapter.java
public class FlowDataAdapter extends BaseAdapter {
private List<HashMap<String,Object>> hashMapList;
private Context context;
public final class ViewHolder { //自定义控件集合
public ImageView appImage;
public TextView appName;
public TextView appFlowData;
}
public FlowDataAdapter(List<HashMap<String,Object>> hashMapList, Context context) {
this.hashMapList = hashMapList;
this.context = context;
}
@Override
public int getCount() {
return hashMapList.size();
}
@Override
public Object getItem(int position) {
return hashMapList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView==null)
{
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list_flow_data,null);
viewHolder.appName = (TextView) convertView.findViewById(R.id.appName);
viewHolder.appFlowData = (TextView) convertView.findViewById(R.id.appFlowData);
viewHolder.appImage = (ImageView) convertView.findViewById(R.id.appImage);
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.appName.setText(hashMapList.get(position).get("appName").toString());
viewHolder.appFlowData.setText(hashMapList.get(position).get("appFlowData").toString());
viewHolder.appImage.setImageDrawable((Drawable) hashMapList.get(position).get("appImage"));
return convertView;
}
}