124.第三方程序和系统程序分开展示

来源:互联网 发布:java爬虫爬取今日头条 编辑:程序博客网 时间:2024/05/18 01:02

用户程序和系统程序一起展示,页面的首先上部分展示用户第三方程序,从position=0开始,然后从position=用户程序.size+1展示系统程序。同ListView的形式将数据内容一条条展示。需要注意的是中间会添加2个特殊条目,一个是第三方应用的指示的特殊条目,一个是系统应用指示的特殊条目。

activity_app_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:orientation="vertical" >        <TextView style="@style/TitleStyle"    android:text="软件管理"        />    <LinearLayout         android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"        >        <TextView             android:id="@+id/tv_rom"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="内存可用"    android:textSize="20sp"    android:textColor="@color/black"    android:layout_weight="1"            /><TextView     android:id="@+id/tv_sd"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="内存可用"    android:textSize="20sp"    android:textColor="@color/black"    android:layout_weight="1"            />           </LinearLayout><include     android:id="@+id/list_view_callsafe"    layout="@layout/list_view_callsafe"        /></LinearLayout>

条目单个显示的布局文件item_app_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:orientation="horizontal" >        <ImageView         android:id="@+id/iv_icon"        android:layout_width="50dp"    android:layout_height="50dp"    android:background="@drawable/ic_launcher"        />    <LinearLayout         android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:orientation="vertical"        >        <TextView             android:id="@+id/tv_name"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="20sp"    android:textColor="@color/black"    android:singleLine="true"    android:text="手机卫视"            />        <TextView             android:id="@+id/tv_location"            android:layout_width="match_parent"    android:layout_height="wrap_content"    android:textSize="16sp"    android:layout_marginTop="2dp"    android:singleLine="true"    android:text="手机内存"            />         </LinearLayout>    <RelativeLayout         android:layout_width="wrap_content"   android:layout_height="wrap_content"        >   <TextView       android:id="@+id/tv_apksize"         android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:textSize="16sp"   android:layout_marginTop="10dp"   android:layout_marginRight="10dp"   android:singleLine="true"   android:text="112M"   android:layout_alignParentRight="true"            />            </RelativeLayout></LinearLayout>
AppInfo.javaapp细节的bean文件

package com.ldw.safe.bean;import android.graphics.drawable.Drawable;public class AppInfo {//图片的icon,Drawable比bitmap更广泛,后者只针对图,前者可以针对xmlprivate Drawable icon;private String apkName;private long apkSize;//app的大小private boolean userApp;//true表示用户app,false表示系统appprivate boolean isRom;//app放置的位置private String apkPackageName;//app的包名public Drawable getIcon() {return icon;}public void setIcon(Drawable icon) {this.icon = icon;}public String getApkName() {return apkName;}public void setApkName(String apkName) {this.apkName = apkName;}public long getApkSize() {return apkSize;}public void setApkSize(long apkSize) {this.apkSize = apkSize;}public boolean isUserApp() {return userApp;}public void setUserApp(boolean userApp) {this.userApp = userApp;}public boolean isRom() {return isRom;}public void setRom(boolean isRom) {this.isRom = isRom;}public String getApkPackageName() {return apkPackageName;}public void setApkPackageName(String apkPackageName) {this.apkPackageName = apkPackageName;}@Overridepublic String toString() {return "AppInfo [icon=" + icon + ", apkName=" + apkName + ", apkSize="+ apkSize + ", userApp=" + userApp + ", isRom=" + isRom+ ", apkPackageName=" + apkPackageName + "]";}}

AppInfos.java获取所以app信息的逻辑文件

package com.ldw.safe.engine;import java.io.File;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;import com.ldw.safe.bean.AppInfo;/* * apps的基本信息 */public class AppInfos {//app的信息是多个,返回一个集合public static List<AppInfo> getAppInfos(Context context){ArrayList<AppInfo> packageAppInfos = new ArrayList<AppInfo>();//获取到包的管理者PackageManager packageManager = context.getPackageManager();//获取到所有的安装包List<PackageInfo> installedPackages= packageManager.getInstalledPackages(0);for(PackageInfo installedPackage : installedPackages){AppInfo appInfo = new AppInfo();//获取到应用程序的图标Drawable drawable = installedPackage.applicationInfo.loadIcon(packageManager);appInfo.setIcon(drawable);//获取到应用程序的名字String apkName = (String) installedPackage.applicationInfo.loadLabel(packageManager);appInfo.setApkName(apkName);//获取到应用程序的包名String apkPackageName = installedPackage.packageName;appInfo.setApkPackageName(apkPackageName);//获取到应用程序的路径String sourceDir = installedPackage.applicationInfo.sourceDir;//获取到应用程序的大小File file = new File(sourceDir);long apkSize = file.length();appInfo.setApkSize(apkSize);//第三方应用放在/data/app//系统应用放在/system/app//获取到安装程序的标记int flags = installedPackage.applicationInfo.flags;//和系统应用进行与运算if((flags & ApplicationInfo.FLAG_SYSTEM) != 0){//系统应用appInfo.setUserApp(false);}else{//第三方应用appInfo.setUserApp(true);}//判断位置if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0){//sd卡appInfo.setRom(false);}else{//rom手机内存appInfo.setRom(true);}packageAppInfos.add(appInfo);//System.out.println("==============");//System.out.println("名字"+ apkName);//System.out.println("包名"+ apkPackageName);//System.out.println("大小"+ apkSize);}return packageAppInfos;}}

AppManagerActivity.java显示第三方和系统应用的app,包括2个特殊条目

package com.ldw.safe.Activity;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.text.format.Formatter;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import com.ldw.safe.R;import com.ldw.safe.bean.AppInfo;import com.ldw.safe.engine.AppInfos;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;/* * 软件管理 */public class AppManagerActivity extends Activity {//不用findViewById的方法填充@ViewInject(R.id.list_view_callsafe)private ListView list_view_callsafe;@ViewInject(R.id.tv_rom)private TextView tv_rom;@ViewInject(R.id.tv_sd)private TextView tv_sd;private List<AppInfo> appInfos;//所有应用的集合private AppManagerAdapter adapter;private ArrayList<AppInfo> userAppInfos;//第三方应用的集合private ArrayList<AppInfo> systemAppInfos;//系统应用的集合@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initUi();        initData();}private class AppManagerAdapter extends BaseAdapter{@Overridepublic int getCount() {//多出2个特殊的条目return userAppInfos.size() + systemAppInfos.size() + 2;}@Overridepublic Object getItem(int position) {//获取到ListView中应该显示的正常的对象if(position == 0){return null;}else if(position == userAppInfos.size() + 1){return null;}AppInfo appInfo;if(position < userAppInfos.size() + 1){//中间添加了一个条目,需要减掉appInfo = userAppInfos.get(position - 1);}else{//多出了2个特殊条目int location = 1 + userAppInfos.size() + 1;appInfo = systemAppInfos.get(position - location);}return appInfo;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if(position == 0){//第三方应用程序的展示TextView textView = new TextView(AppManagerActivity.this);textView.setTextColor(Color.WHITE);textView.setBackgroundColor(Color.GRAY);textView.setText("第三方应用(" + userAppInfos.size() + ")");return textView;}else if(position == userAppInfos.size() + 1){//系统程序的展示TextView textView = new TextView(AppManagerActivity.this);textView.setTextColor(Color.WHITE);textView.setBackgroundColor(Color.GRAY);textView.setText("系统应用(" + systemAppInfos.size() + ")");return textView;}            AppInfo appInfo;            if (position < userAppInfos.size() + 1) {                //把多出来的特殊的条目减掉                appInfo = userAppInfos.get(position - 1);            } else {                int location = userAppInfos.size() + 2;                appInfo = systemAppInfos.get(position - location);            }View view = null;ViewHoler holder;//防止特殊条目的影响,特殊条目的LinearLayout是空的if(convertView != null && convertView instanceof LinearLayout){view = convertView;holder = (ViewHoler) convertView.getTag();}else{view = View.inflate(AppManagerActivity.this, R.layout.item_app_manager, null);holder = new ViewHoler();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);holder.tv_apksize = (TextView) view.findViewById(R.id.tv_apksize);holder.tv_location = (TextView) view.findViewById(R.id.tv_location);holder.tv_name = (TextView) view.findViewById(R.id.tv_name);view.setTag(holder);}//AppInfo appInfo = appInfos.get(position);holder.iv_icon.setBackground(appInfo.getIcon());holder.tv_apksize.setText(Formatter.formatShortFileSize(AppManagerActivity.this, appInfo.getApkSize()));holder.tv_name.setText(appInfo.getApkName());if(appInfo.isRom()){//手机内存holder.tv_location.setText("手机内存");}else{//sd卡holder.tv_location.setText("sd卡内存");}return view;}}static class ViewHoler{ImageView  iv_icon;TextView tv_apksize;TextView tv_location;TextView tv_name;}private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg){adapter = new AppManagerAdapter();list_view_callsafe.setAdapter(adapter);}};/* * 初始化apk的数据 */private void initData() {//子线程中初始化,防止anrnew Thread(){@Overridepublic void run(){//获取到安装的所有的应用程序appInfos = AppInfos.getAppInfos(AppManagerActivity.this);//第三方应用的集合userAppInfos = new ArrayList<AppInfo>();//系统应用的集合systemAppInfos = new ArrayList<AppInfo>();for(AppInfo appInfo:appInfos){if(appInfo.isUserApp()){//第三方应用的集合添加数据userAppInfos.add(appInfo);}else{//系统应用集合添加数据systemAppInfos.add(appInfo);}}handler.sendEmptyMessage(0);}}.start();}//初始化界面private void initUi() {setContentView(R.layout.activity_app_manager);//View viewById = findViewById(R.id.list_view_callsafe);//不用findViewById的方法填充ViewUtils.inject(this);//获取到rom内存的剩余空间long rom_freeSpace = Environment.getDataDirectory().getFreeSpace();//获取到sd卡的剩余空间long sd_freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();System.out.println("内存可用" + rom_freeSpace + "sd卡可用" + sd_freeSpace);//格式化存储卡的大小tv_rom.setText("内存可用" + Formatter.formatFileSize(this, rom_freeSpace));tv_sd.setText("sd卡可用" + Formatter.formatFileSize(this, sd_freeSpace));}}




0 0