软件管理功能-----卸载功能

app的下载链接:https://pan.baidu.com/s/15yZV8ueYd7SWa1k9fHPQ3Q 密码:2zpm

app jar包链接:https://pan.baidu.com/s/1lb5VVY6qRy1VAw7mthCkgA 密码:i177

            软件管理功能

页面:展示系统和用户软件,并且每一项都可进行点击操作

1.卸载

2.启动

3.设置

          主页面展示

AppBean对象类,里面包含apk的信息

package com.bw.antiVirusApp.bean;
import android.graphics.drawable.Drawable;
public class AppBean {
    private String appName;    //apk的名字
    private Drawable icon;     //apk的图标
    private long size;         //apk的大小
    private boolean isSd;      //是否存在sd卡上
    private boolean isSystem;  //判断是否使系统pak
    private String packName;   //apk的包名
    private String akPath;     //apk的安装路径
    
    public String getAkPath() {
        return akPath;
    }
    public void setAkPath(String akPath) {
        this.akPath = akPath;
    }
    public String getPackName() {
        return packName;
    }
    public void setPackName(String packName) {
        this.packName = packName;
    }
    public String getAppName() {
        return appName;
    }
    public void setAppName(String appName) {
        this.appName = appName;
    }
    public Drawable getIcon() {
        return icon;
    }
    public void setIcon(Drawable icon) {
        this.icon = icon;
    }
    public long getSize() {
        return size;
    }
    public void setSize(long size) {
        this.size = size;
    }
    public boolean isSd() {
        return isSd;
    }
    public void setSd(boolean isSd) {
        this.isSd = isSd;
    }
    public AppBean(String appName, Drawable icon, long size, boolean isSd) {
        super();
        this.appName = appName;
        this.icon = icon;
        this.size = size;
        this.isSd = isSd;
    }
    public AppBean() {
        super();
    }
    public boolean isSystem() {
        return isSystem;
    }
    public void setSystem(boolean isSystem) {
        this.isSystem = isSystem;
    }
    
    
}

 

获取手机上的所有的apk,并且返回装有apk信息的list集合

package com.bw.antiVirusApp.engine;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.bw.antiVirusApp.bean.AppBean;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Environment;

public class AppManagerEngine {

    /* 
     * 获取SD卡的可用空间
     * */
    public static long getSDAvial(Context context){
        long sdAvial=0;
        //获取SD卡的目录
        File externalStorageDirectory = 
Environment.getExternalStorageDirectory();
                //剩余空间的字节数
        sdAvial=externalStorageDirectory.getFreeSpace();
        return sdAvial;
    }
    /*
     *获取手机的剩余空间 
     * */
    public static long getRomAvial(Context context){
        long romAvial=0;
        //获取手机的目录
        File dataDirectory = Environment.getDataDirectory();
        romAvial=dataDirectory.getFreeSpace();
        return romAvial;
    }
    
    /*
     * 获取手机中的所有软件
     * */
    public static List<AppBean> getALLApks(Context context){
        
        List<AppBean> list=new ArrayList<AppBean>();
        
        //获取包管理器
        PackageManager pm=context.getPackageManager();
        
        //1、获取所有安装的apk        
        List<ApplicationInfo> installedApplications = pm.getInstalledApplications(0);
        
        for (ApplicationInfo applicationInfo : installedApplications) {
            AppBean bean=new AppBean();
            //获取apk的名字,加空“”,转化成字符串,loadLabel:清单文件里面apk的名字是loadLabel命名的
            bean.setAppName(applicationInfo.loadLabel(pm)+"");
            //获取图标
            bean.setIcon(applicationInfo.loadIcon(pm));
            //获取文件夹路径的大小
            String sourceDir = applicationInfo.sourceDir;
            File file=new File(sourceDir);
            bean.setSize(file.length());

             //该程序拥有的所有属性
            int flags = applicationInfo.flags;
            //是否是系统自带apk
            if ((flags & applicationInfo.FLAG_SYSTEM)!=0) {
                //系统自带APP
                bean.setSystem(true);            
            }else {
                bean.setSystem(false);
            }    
            
            //是否在sd卡上
            if ((flags & applicationInfo.FLAG_EXTERNAL_STORAGE)!=0) {
                //系统自带APP
                bean.setSd(true);            
            }else {
                bean.setSd(false);
            }    
            //获取包名
            bean.setPackName(applicationInfo.packageName);
            bean.setAkPath(applicationInfo.sourceDir);
            list.add(bean);            
        }
        return list;
        
    }
    
}
        

 

主页面所需的方法

 1 public class AppmanagerActivity extends Activity 
 2 {
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         initView();//初始化控件
 7         initData();//初始化数据
 8         initEvent();//初始化事件
 9         initPopupWindow();//显示弹窗
10         initRemoveReceiver();//移除注册的广播
11     }
12 }

 

展示listView数据的适配器

 

1
public class MyAdpater extends BaseAdapter { 2 3 @Override 4 public int getCount() { 5 // TODO Auto-generated method stub 6 //titl也算一项,系统软件和用户软件描述的两个TextView也算在listview的每一项里面 7 return sysApps.size()+1+userApps.size()+1; 8 } 9 10 @Override 11 public AppBean getItem(int position) { 12 // TODO Auto-generated method stub 13 AppBean bean=null; 14 if (position<=userApps.size()) { 15 bean=userApps.get(position-1); 16 }else { 17 bean=sysApps.get(position-userApps.size()-1-1); 18 } 19 return bean; 20 } 21 22 @Override 23 public long getItemId(int position) { 24 // TODO Auto-generated method stub 25 return 0; 26 } 27 28 @Override 29 public View getView(int position, View convertView, ViewGroup parent) { 30 // TODO Auto-generated method stub 31 if (position==0) 32 { 33 TextView tv_userTable=new TextView(getApplicationContext()); 34 tv_userTable.setText("用户软件:"+userApps.size()); 35 tv_userTable.setTextColor(Color.WHITE); 36 tv_userTable.setBackgroundColor(Color.GRAY); 37 return tv_userTable; 38 } 39 else if (position==userApps.size()+1) 40 { 41 TextView tv_systemTable=new TextView(getApplicationContext()); 42 tv_systemTable.setText("系统软件:"+sysApps.size()); 43 tv_systemTable.setTextColor(Color.WHITE); 44 tv_systemTable.setBackgroundColor(Color.GRAY); 45 return tv_systemTable; 46 } 47 else 48 { 49 ViewHolder holder=new ViewHolder(); 50 if (convertView!=null && convertView instanceof RelativeLayout) { 51 holder=(ViewHolder) convertView.getTag(); 52 }else { 53 convertView=View.inflate(getApplicationContext(), R.layout.item_appmanager_listview_item, null); 54 holder.iv_icon=(ImageView) convertView.findViewById(R.id.iv_appmanager_listview_item_icon); 55 holder.tv_title=(TextView) convertView.findViewById(R.id.tv_appmanager_listview_item_title); 56 holder.tv_location=(TextView) convertView.findViewById(R.id.tv_appmanager_listview_item_location); 57 holder.tv_size=(TextView) convertView.findViewById(R.id.tv_appmanager_listview_item_size); 58 convertView.setTag(holder); 59 } 60 AppBean bean=getItem(position); 61 holder.iv_icon.setImageDrawable(bean.getIcon()); 62 if (bean.isSd()) { 63 holder.tv_location.setText("sd存储"); 64 }else { 65 holder.tv_location.setText("手机空间存储"); 66 } 67 holder.tv_title.setText(bean.getAppName()); 68 holder.tv_size.setText(Formatter.formatFileSize(getApplicationContext(),bean.getSize())); 69 } 70 return convertView; 71 72 } 73 }

    //优化listview
74 public class ViewHolder { 75 ImageView iv_icon; 76 TextView tv_title; 77 TextView tv_location; 78 TextView tv_size; 79 }

 

页面显示主要是initView()和initData()方法,需要查找控件和装在数据到 集合中,查找数据需要 

 1 private void initView() {
 2         // TODO Auto-generated method stub
 3         setContentView(R.layout.activity_appmanager);
 4         tv_romsize=(TextView) findViewById(R.id.tv_appmanager_romsize);
 5         tv_sdsize=(TextView) findViewById(R.id.tv_appmanager_sdsize);
 6         tv_listview_label=(TextView) findViewById(R.id.tv_listview_label);
 7         //显示数据的view
 8         lv_appdatas=(ListView)findViewById(R.id.lv_appmanager_appdatas);
 9         pb_loading=(ProgressBar)findViewById(R.id.pb_appmanager_loading);
10         sysApps=new ArrayList<AppBean>();
11         userApps=new ArrayList<AppBean>();
12         myAdpater=new MyAdpater();
13         lv_appdatas.setAdapter(myAdpater);
14         pm=getPackageManager();
15     }

 

 1 Handler handler=new Handler(){
 2         @Override
 3         public void handleMessage(Message msg) {
 4             // TODO Auto-generated method stub
 5             super.handleMessage(msg);
 6             switch (msg.what) {
 7             case Loading:
 8                 pb_loading.setVisibility(View.VISIBLE);
 9                 lv_appdatas.setVisibility(View.GONE);
10                 break;
11             case Finsh:
12                 pb_loading.setVisibility(View.GONE);
13                 lv_appdatas.setVisibility(View.VISIBLE);
14                 tv_listview_label.setText("用户软件:"+userApps.size());
15                 tv_listview_label.setVisibility(View.VISIBLE);
16                 tv_romsize.setText("手机内存可用空间:"+Formatter.formatFileSize(getApplicationContext(), romAvial));
17                 tv_sdsize.setText("SD卡可用空间:"+Formatter.formatFileSize(getApplicationContext(), sdAvial));
18                 myAdpater.notifyDataSetChanged();
19                 break;
20         
21             }
22         }
23     };
24     
25 /*
26  * 加载数据写到线程里面
27  */
28 private void initData() {
29     // TODO Auto-generated method stub
30     new Thread(){
31         public void run() {
32             //1、开始加载数,发送消息让界面显示进度
33             
34             handler.obtainMessage(Loading).sendToTarget();
35             SystemClock.sleep(1000);
36             sysApps.clear();
37             userApps.clear();
38             //2、获取数据
39             List<AppBean> beans=AppManagerEngine.getALLApks(getApplicationContext());
40             for (AppBean appBean : beans) 
41             {
42                 if (appBean.isSystem()) {
43                     sysApps.add(appBean);
44                 }else {
45                     userApps.add(appBean);
46                 }
47                 romAvial = AppManagerEngine.getRomAvial(getApplicationContext());
48                 sdAvial = AppManagerEngine.getSDAvial(getApplicationContext());
49             }
50             //3、发送消息去显示数据
51             handler.obtainMessage(Finsh).sendToTarget();
52             super.run();    
53         };
54     }.start();
55 }

initEvent()主要处理是标识用户软件还是系统软件哪两个TextView的显示
private void initEvent() {
    // TODO Auto-generated method stub
    lv_appdatas.setOnItemClickListener(new OnItemClickListener() {
        @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub
                    if (position==0|| position==userApps.size()+1) 
                    {
                        return;
                    }
                    clickbean=(AppBean) lv_appdatas.getItemAtPosition(position);
                    int[] location=new int[2];
                    view.getLocationInWindow(location);//获取视图左上定点的坐标
                    showPopupWindows(view,location[0]+80,location[1]);
                }
    });

    lv_appdatas.setOnScrollListener(new OnScrollListener() {
        
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub
            
        }
        
        /*
         * 触摸滑动,状态变化
         */
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
            //firstVisibleItem:第一项内容
            //visibleItemCount:当前页面有多少向
            //totalItemCount:一共有多少项数据。
            closePopupWindows();
            if(firstVisibleItem>=userApps.size()+1)
            {
                tv_listview_label.setText("系统软件:"+sysApps.size());
            }
            else {
                tv_listview_label.setText("用户软件"+userApps.size());
            }
        }
    });
}

以上的代码足以显示所有软件,显示图如下:

 

 

 

          卸载功能

1.首先要引入一个jar包:RootTools.jar。

 

posted @ 2018-06-11 16:28  安琪儿。流苏  阅读(281)  评论(0)    收藏  举报