zoukankan      html  css  js  c++  java
  • Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags

    1. int flags = packageInfo.applicationInfo.flags
    2. 0000 0000 0000 0000 0000 0000 0000 0000 //int的32位每一位的0或者1表示一个boolean值
    3. 适用于需要大量boolean变量的场景,提高效率
    4. 具体代码

    int flags = packInfo.applicationInfo.flags;
    if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
    //系统应用
    } else {
    //用户应用
    }
    if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
    //安装在sd卡
    } else {
    //安装在手机内存
    }

    ###2.应用的安装位置
    <manifest
    ... SD卡 手机内存 手机内存
    android:installLocation="preferExternal | internalOnly | auto"
    />

    ###3.如何区分显示系统应用和用户应用
    1. 将“应用程序集合”拆分成“用户程序集合”和“系统程序集合”两个集合
    2. 在getView方法中,根据position判断,该位置应该是用户程序还是系统程序,在从对应的集合中取出数据
    3. 注意,当显示第二个集合的数据时,需要对position进行修正

    ###4.将标签加入到ListView的item中显示
    1. 在getCount中计算出正确的个数:用户程序个数+系统程序个数+标签个数
    2. 在getView中,根据position判断需要显示的四种类型:用户程序标签、用户程序、系统程序标签、系统程序,根据不同的类型返回不同的view
    3. 注意,标签是插在列表的前面和中间,需要对position进行修正

    ###5.ListView的item具有多种布局
    当我们在Adapter中调用方法getView的时候,如果整个列表中的Item View如果有多种类型布局,如:

    ![](http://i.imgur.com/ug4MqzT.jpg)

    我们继续使用convertView来将数据从新填充貌似不可行了,因为每次返回的convertView类型都不一样,无法重用。

    Android在设计上的时候,也想到了这点。所以,在adapter中预留的两个方法。

    public int getViewTypeCount(); //有多少种布局类型
    public int getItemViewType(int position); //获取某个位置是哪种类型类型

    只需要重写这两个方法,设置一下ItemViewType的个数和判断方法,Recycler就能有选择性的给出不同的convertView了。

    private static final int TYPE_LABEL = 0;
    private static final int TYPE_CONTENT = 1;

    private class AppManagerAdapter extends BaseAdapter{

    @Override
    public int getViewTypeCount() {
    return 2;
    }

    @Override
    public int getItemViewType(int position) {
    if(position == 0 || position == userAappInfos.size()+1){
    return TYPE_LABEL;
    }else{
    return TYPE_CONTENT;
    }
    }

    /**
    * 返回listview里面有多少个条目
    */
    @Override
    public int getCount() {
    //为什么要加两个1 , 增加了两个textview的标签。整个listview条目的个数增加了。
    return 1+userAappInfos.size()+1+systemAppInfos.size();
    }

    /**
    * 显示每个条目的view对象
    */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    LabelViewHolder labelViewHolder = null;
    ContentViewHolder contentViewHolder = null;

    int type = getItemViewType(position);
    if(convertView == null){
    switch (type) {
    case TYPE_LABEL:
    convertView = new TextView(AppManagerActivity.this);
    labelViewHolder = new LabelViewHolder();
    labelViewHolder.tv_label = (TextView) convertView;
    labelViewHolder.tv_label.setBackgroundColor(Color.GRAY);
    convertView.setTag(labelViewHolder);
    break;
    case TYPE_CONTENT:
    convertView = View.inflate(getApplicationContext(), R.layout.item_appinfo, null);
    contentViewHolder = new ContentViewHolder();
    contentViewHolder.iv_appIcon = (ImageView) convertView.findViewById(R.id.iv_appicon);
    contentViewHolder.tv_appName = (TextView) convertView.findViewById(R.id.tv_appName);
    contentViewHolder.tv_apkSize = (TextView) convertView.findViewById(R.id.tv_apkSize);
    contentViewHolder.iv_install_location = (ImageView) convertView.findViewById(R.id.iv_install_location);
    convertView.setTag(contentViewHolder);
    break;
    }
    }else{
    switch (type) {
    case TYPE_LABEL:
    labelViewHolder = (LabelViewHolder) convertView.getTag();
    break;
    case TYPE_CONTENT:
    contentViewHolder = (ContentViewHolder) convertView.getTag();
    break;
    }
    }

    switch (type) {
    case TYPE_LABEL:
    if(position == 0){
    labelViewHolder.tv_label.setText("用户程序:"+userAappInfos.size());
    }else{
    labelViewHolder.tv_label.setText("系统程序:"+systemAppInfos.size());
    }
    break;
    case TYPE_CONTENT:
    AppInfo appInfo;
    if(position<=userAappInfos.size()){//用户程序
    int newPosition = position - 1;//减去用户的标签textview占据的位置
    appInfo = userAappInfos.get(newPosition);
    }else {//系统程序
    int newPosition = position - 1 - userAappInfos.size() - 1;
    appInfo = systemAppInfos.get(newPosition);
    }

    contentViewHolder.iv_appIcon.setImageDrawable(appInfo.getAppIcon());
    contentViewHolder.tv_appName.setText(appInfo.getAppName());
    contentViewHolder.tv_apkSize.setText("程序大小:"+Formatter.formatFileSize(getApplicationContext(), appInfo.getAppSize()));
    if(appInfo.isInRom()){
    contentViewHolder.iv_install_location.setImageResource(R.drawable.memory);
    }else{
    contentViewHolder.iv_install_location.setImageResource(R.drawable.sd);
    }
    break;
    }

    return convertView;
    }

    @Override
    public Object getItem(int position) {
    return null;
    }

    @Override
    public long getItemId(int position) {
    return 0;
    }
    }

    /**
    * 存放内容孩子对象的引用
    */
    static class ContentViewHolder{
    ImageView iv_appIcon;
    TextView tv_appName;
    TextView tv_apkSize;
    ImageView iv_install_location;
    }

    /**
    * 存放标签孩子对象的引用
    */
    static class LabelViewHolder{
    TextView tv_label;
    }

    ###6.ListView的OnScrollListener--滑动监听器
    public static int SCROLL_STATE_IDLE = 0; //停止
    public static int SCROLL_STATE_TOUCH_SCROLL = 1; //手指拖动
    public static int SCROLL_STATE_FLING = 2; //惯性滑动

    listView.setonScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    //滚动状态发生变化。0停止,1手指拖动,2惯性滑动
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
    //当listview正在滚动的时候调用的方法
    //firstVisibleItem:第一个显示的Item的位置
    //visibleItemCount:可显示的Item的总数
    //totalItemCount:Item的总数
    }
    });

    ###7.PopupWindow的使用
    //创建,指定显示的View和宽高
    PopupWindow ppw = new PopupWindow(View contentView, int width, int height);
    //显示,parent并不是指要把contentView 添加到parent上,而是要获取token
    ppw. showAtLocation(View parent, int gravity, int x, int y);
    //关闭
    ppw. dismiss();

    ###8.PopupWindow使用注意事项
    1.在show之前dismiss掉之前创建的,避免重复显示
    2.在Activity的onDestory()的时候dismiss,避免窗体泄漏

    ###9.获取View在Window中的位置
    int[] location = new int[2];
    view.getLocationInWindow(location);
    Location[0]: x坐标
    Location[1]: y坐标

    获取View在父View中的位置
    view.getX();
    view.getY();

    ###10.PopupWindow不显示动画的原因
    1.手机中设置了动画关闭
    2.PopupWindow没有设置背景

    注:PopupWindow要设置背景和获取焦点,才能有点击弹框外消失的效果

    ###1.卸载应用的Intent
    卸载请求

    Intent intent = new Intent();
    intent.setAction("android.intent.action.DELETE");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.setData(Uri.parse("package:"+clickedAppInfo.getPackName()));
    startActivity(intent);
    安装请求

    Intent intent = new Intent();
    intent.setAction("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.setDataAndType(
    Uri.fromFile(new File(apk_path)),
    "application/vnd.android.package-archive");
    startActivity(intent);

    ###2.接收卸载应用程序的广播
    AppUninstallReceiver receiver = new AppUninstallReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    filter.addDataScheme("package");
    registerReceiver(receiver, filter);

    * **相关广播**
    * ACTION\_PACKAGE\_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播,(当前正在安装的程序不能接收这个广播))
    * ACTION\_PACKAGE\_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
    * ACTION\_PACKAGE\_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被卸载的包程序不能接收到这个广播)
    ###3.遍历集合时如何删除数据
    方法一:高级for循环,记录要删除的数据,遍历后再删除
    AppInfo deleteAppInfo = null;
    //更新ui界面
    for(AppInfo appinfo: userAppInfos){
    if(appinfo.getPackName().equals(packname)){
    deleteAppInfo = appinfo;
    }
    }
    if(deleteAppInfo!=null){
    userAppInfos.remove(deleteAppInfo);
    }

    方法二:使用迭代器进行遍历,可在遍历中删除
    Iterator<AppInfo> iterator = userAppInfos.iterator();
    while(iterator.hasNext()){
    AppInfo appinfo = iterator.next();
    if (appinfo.getPackName().equals(packname)) {
    iterator.remove();
    }
    }

    方法三:使用普通for循环倒叙,可在遍历中删除。注意:如不采用倒叙,会遍历不全
    for (int i = userAppInfos.size() - 1; i >= 0; i--) {
    AppInfo appinfo = userAppInfos.get(i);
    if (appinfo.getPackName().equals(packname)) {
    userAppInfos.remove(i);
    break;
    }
    }

    ###4.启动一个应用程序
    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage(clickedAppInfo.getPackName());
    if(intent!=null){
    startActivity(intent);
    }else{
    Toast.makeText(this, "对不起,该应用无法被开启", 0).show();
    }

    ###5.分享
    Intent intent = new Intent();
    intent.setAction("android.intent.action.SEND");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "推荐你使用一款软件:"+clickedAppInfo.getAppName()+",真的很好用哦");
    startActivity(intent);

    ###6.详细信息
    Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setData(Uri.parse("package:"+clickedAppInfo.getPackName()));
    startActivity(intent);

     主要代码:

      1 package com.hb.mobilesafe.activities;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import android.annotation.SuppressLint;
      7 import android.app.Activity;
      8 import android.content.BroadcastReceiver;
      9 import android.content.Context;
     10 import android.content.Intent;
     11 import android.content.IntentFilter;
     12 import android.content.pm.PackageManager;
     13 import android.graphics.Color;
     14 import android.graphics.drawable.ColorDrawable;
     15 import android.net.Uri;
     16 import android.os.Bundle;
     17 import android.text.format.Formatter;
     18 import android.view.Gravity;
     19 import android.view.View;
     20 import android.view.View.OnClickListener;
     21 import android.view.ViewGroup;
     22 import android.view.Window;
     23 import android.view.animation.Animation;
     24 import android.view.animation.ScaleAnimation;
     25 import android.widget.AbsListView;
     26 import android.widget.AbsListView.OnScrollListener;
     27 import android.widget.AdapterView;
     28 import android.widget.AdapterView.OnItemClickListener;
     29 import android.widget.BaseAdapter;
     30 import android.widget.ImageView;
     31 import android.widget.LinearLayout;
     32 import android.widget.ListView;
     33 import android.widget.PopupWindow;
     34 import android.widget.TextView;
     35 import android.widget.Toast;
     36 
     37 import com.hb.demo_mobilesafe.R;
     38 import com.hb.mobilesafe.bean.mPackageInfo;
     39 import com.hb.mobilesafe.utils.MermorySize;
     40 import com.hb.mobilesafe.utils.PackageInfoUtil;
     41 
     42 public class SoftwareManagerActivity extends Activity implements OnClickListener{
     43     private TextView tv_software_count;
     44     private TextView tv_rom_available;
     45     private TextView tv_sdcard_available;
     46     private List<mPackageInfo> appInfo;
     47     private List<mPackageInfo> userInfo;
     48     private List<mPackageInfo> sysInfo;
     49     private ListView lv_show_allapp;
     50     private LinearLayout ll_progressbar;
     51     private MyAdapter adapter;
     52     private PopupWindow pw;
     53     private mPackageInfo mInfo;
     54     private LinearLayout ll_uninstall,ll_start,ll_share,ll_information;
     55     private MyReceiver receiver;
     56     
     57     @Override
     58     protected void onCreate(Bundle savedInstanceState) {
     59         super.onCreate(savedInstanceState);
     60         requestWindowFeature(Window.FEATURE_NO_TITLE);
     61         setContentView(R.layout.activity_softmanager);
     62         initView();
     63         initDate();
     64 
     65 
     66     }
     67     private void initView() {
     68         tv_rom_available=(TextView) findViewById(R.id.tv_rom_available);
     69         tv_sdcard_available=(TextView) findViewById(R.id.tv_sdcard_available);
     70         lv_show_allapp=(ListView) findViewById(R.id.lv_show_allapp);
     71         ll_progressbar=(LinearLayout) findViewById(R.id.ll_progressbar);
     72         tv_software_count=(TextView) findViewById(R.id.tv_software_count);
     73     }
     74     private void initDate() {
     75 //        mInfo=new mPackageInfo();
     76         //rom可用
     77         tv_rom_available.setText("机身内存可用:"+Formatter.formatFileSize(this, MermorySize.getMermory()));
     78         //sdcard可用
     79         tv_sdcard_available.setText("SD卡内存可用:"+Formatter.formatFileSize(this, MermorySize.getSd()));
     80 
     81         ll_progressbar.setVisibility(View.VISIBLE);
     82         new Thread(){
     83             public void run() {
     84                 appInfo = PackageInfoUtil.getAppInfo(SoftwareManagerActivity.this);
     85                 isSysUserApp();
     86                 adapter = new MyAdapter();
     87                 runOnUiThread(new Runnable() {
     88                     public void run() {
     89                         lv_show_allapp.setAdapter(adapter);
     90                         ll_progressbar.setVisibility(View.INVISIBLE);
     91 
     92                     }
     93                 });
     94 
     95             };
     96         }.start();
     97         lv_show_allapp.setOnScrollListener(new OnScrollListener() {
     98             //滑动后发生改变
     99             @Override
    100             public void onScrollStateChanged(AbsListView view, int scrollState) {
    101                 
    102             }
    103             //正在滑动
    104             @Override
    105             public void onScroll(AbsListView view, int firstVisibleItem,
    106                     int visibleItemCount, int totalItemCount) {
    107                 if(pw !=null){
    108                     pw.dismiss();
    109                     pw=null;
    110                 }
    111                 if(userInfo !=null && sysInfo !=null){
    112 
    113                     if(firstVisibleItem == 0){
    114                         tv_software_count.setVisibility(View.GONE);
    115                     }
    116                     //else if(firstVisibleItem == userInfo.size()+1){
    117                     //tv_software_count.setVisibility(View.GONE);
    118                     //}
    119                     else{
    120                         tv_software_count.setVisibility(View.VISIBLE);
    121                     }
    122                     if(firstVisibleItem <=userInfo.size()){
    123                         tv_software_count.setText("用户程序:"+userInfo.size());
    124                     }else{
    125                         tv_software_count.setText("系统程序:"+sysInfo.size());
    126                     }
    127                 }
    128             }
    129         });
    130         lv_show_allapp.setOnItemClickListener(new OnItemClickListener() {
    131 
    132 
    133 
    134             @Override
    135             public void onItemClick(AdapterView<?> parent, View view,
    136                     int position, long id) {
    137                 //判断如果点击的是两个TextView就让他什么都不执行
    138                 if(position == 0 || position ==userInfo.size()+1){
    139                     return;
    140                 }
    141                 if(pw != null){
    142                     pw.dismiss();
    143                     pw=null;
    144                     
    145                 }//判断是系统应用还是用户应用
    146                 else if(position<userInfo.size()+1){
    147                     //用户应用位置
    148                     mInfo=userInfo.get(position-1);
    149                 }else{
    150                     //系统应用位置
    151                     mInfo=sysInfo.get(position-2-userInfo.size());
    152                 }
    153                 
    154                 View conver = View.inflate(SoftwareManagerActivity.this, R.layout.popuopwindow_item,null);
    155                 pw = new PopupWindow(conver, -2, -2);
    156                 
    157                 //获取点击位置
    158                 int [] location=new int [2];
    159                 view.getLocationInWindow(location);
    160                 //设置窗体的一个缩放动画
    161                 ScaleAnimation sa = new ScaleAnimation(0.3f, 1f, 0.3f, 1f, Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_SELF);
    162                 //设置缩放时间
    163                 sa.setDuration(500);
    164                 
    165                 //设置窗体的背景(透明的)
    166                 pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    167                 //设置显示的位置
    168                 pw.showAtLocation(parent, Gravity.RIGHT+Gravity.TOP, 30, location[1]-20);
    169                 //pw.setContentView(conver);
    170                 //开启动画
    171                 conver.startAnimation(sa);
    172                 
    173                 
    174                 ll_uninstall=(LinearLayout) conver.findViewById(R.id.ll_uninstall);
    175                 ll_start=(LinearLayout) conver.findViewById(R.id.ll_start);
    176                 ll_share=(LinearLayout) conver.findViewById(R.id.ll_share);
    177                 ll_information=(LinearLayout) conver.findViewById(R.id.ll_information);
    178                 ll_uninstall.setOnClickListener(SoftwareManagerActivity.this);
    179                 ll_start.setOnClickListener(SoftwareManagerActivity.this);
    180                 ll_information.setOnClickListener(SoftwareManagerActivity.this);
    181                 ll_information.setOnClickListener(SoftwareManagerActivity.this);
    182 
    183             }
    184 
    185         });
    186 
    187     }
    188     
    189     @Override
    190     public void onClick(View v) {
    191         Intent intent;
    192         switch (v.getId()) {
    193         //卸载
    194         case R.id.ll_uninstall:
    195             String packageName = mInfo.getPackageName();
    196             System.out.println("packageName:"+packageName);
    197             intent= new Intent();
    198             if(packageName.equals("com.hb.demo_mobilesafe")){
    199                 Toast.makeText(SoftwareManagerActivity.this, "您不能卸载当前App", 0).show();
    200                 pw.dismiss();
    201                 return;
    202             }
    203             intent.setAction("android.intent.action.DELETE");
    204             intent.addCategory("android.intent.category.DEFAULT");
    205             intent.setData(Uri.parse("package:"+packageName));
    206             startActivity(intent);
    207             
    208             IntentFilter filter=new IntentFilter();
    209             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    210             filter.addDataScheme("package");
    211             receiver = new MyReceiver();
    212             registerReceiver(receiver, filter);
    213             
    214             
    215             break;
    216             //启动
    217         case R.id.ll_start:
    218             PackageManager pm=getPackageManager();
    219             intent = pm.getLaunchIntentForPackage(mInfo.getPackageName());
    220             if(intent !=null){
    221                 startActivity(intent);
    222                 pw.dismiss();
    223             }
    224             
    225             break;
    226             //分享
    227         case R.id.ll_share:
    228             intent = new Intent();
    229             intent.setAction("android.intent.action.SEND");
    230             intent.addCategory("android.intent.category.DEFAULT");
    231             intent.setType("text/plain");
    232             intent.putExtra(Intent.EXTRA_TEXT, "推荐你使用一款软件:"+mInfo.getAppName()+",真的很好用哦");
    233             startActivity(intent);
    234             break;
    235             //信息
    236         case R.id.ll_information:
    237             intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
    238             intent.addCategory(Intent.CATEGORY_DEFAULT);
    239             intent.setData(Uri.parse("package:"+mInfo.getPackageName()));
    240             startActivity(intent);
    241             break;
    242         }
    243 
    244     }
    245     private class MyAdapter extends BaseAdapter{
    246         @SuppressLint("ViewHolder") @Override
    247         public View getView(int position, View convertView, ViewGroup parent) {
    248             ViewHolder holder;
    249             if(convertView !=null && convertView instanceof LinearLayout){
    250                 holder=(ViewHolder) convertView.getTag();
    251 
    252             }else{
    253                 holder=new ViewHolder();
    254                 convertView=View.inflate(SoftwareManagerActivity.this, R.layout.appinfo_item, null);
    255                 holder.appIcon=(ImageView) convertView.findViewById(R.id.iv_app_icon);
    256                 holder.appName=(TextView) convertView.findViewById(R.id.tv_pro_name);
    257                 holder.appSize=(TextView) convertView.findViewById(R.id.tv_app_size);
    258                 holder.appLocation=(ImageView) convertView.findViewById(R.id.iv_location);
    259                 convertView.setTag(holder);
    260             }
    261             if(position == 0){
    262                 TextView tv0= new TextView(SoftwareManagerActivity.this);
    263                 if(userInfo.size()==0){
    264                     tv0.setHeight(0);
    265                     return tv0;
    266                 }
    267                 tv0.setClickable(false);
    268                 tv0.setTextColor(Color.WHITE);
    269                 tv0.setBackgroundColor(Color.GRAY);
    270                 tv0.setText("用户程序:"+userInfo.size());
    271                 return tv0;
    272             }else if(position ==userInfo.size()+1){
    273                 TextView tv1= new TextView(SoftwareManagerActivity.this);
    274                 tv1.setClickable(false);
    275                 tv1.setTextColor(Color.WHITE);
    276                 tv1.setBackgroundColor(Color.GRAY);
    277                 tv1.setText("系统程序:"+sysInfo.size());
    278                 return tv1;
    279             }else if(position <= userInfo.size()){
    280                 int newPosition = position-1;
    281                 boolean sd = userInfo.get(newPosition).isSd();
    282                 if(sd){
    283                     holder.appLocation.setBackgroundResource(R.drawable.sd);
    284                 }else{
    285                     holder.appLocation.setBackgroundResource(R.drawable.memory);
    286                 }
    287                 holder.appIcon.setImageDrawable(userInfo.get(newPosition).getIcon());
    288                 holder.appName.setText(userInfo.get(newPosition).getAppName());
    289                 holder.appSize.setText("程序大小:"+Formatter.formatFileSize(SoftwareManagerActivity.this, userInfo.get(newPosition).getAppSize()));
    290             }else{
    291                 int newPosition=position -userInfo.size()-2;
    292                 boolean sd = sysInfo.get(newPosition).isSd();
    293                 if(sd){
    294                     holder.appLocation.setBackgroundResource(R.drawable.sd);
    295                 }else{
    296                     holder.appLocation.setBackgroundResource(R.drawable.memory);
    297                 }
    298                 holder.appIcon.setImageDrawable(sysInfo.get(newPosition).getIcon());
    299                 holder.appName.setText(sysInfo.get(newPosition).getAppName());
    300                 holder.appSize.setText("程序大小:"+Formatter.formatFileSize(SoftwareManagerActivity.this, sysInfo.get(newPosition).getAppSize()));
    301             }
    302             return convertView;
    303         }
    304 
    305         @Override
    306         public int getCount() {
    307             /**
    308              * 返回系统应用与用户应用的数量
    309              */
    310             return sysInfo.size()+1+userInfo.size()+1;
    311         }
    312 
    313         @Override
    314         public Object getItem(int position) {
    315             return null;
    316         }
    317 
    318         @Override
    319         public long getItemId(int position) {
    320             return 0;
    321         }
    322 
    323 
    324 
    325     }
    326     class ViewHolder{
    327         ImageView appIcon;
    328         ImageView appLocation;
    329         TextView appName;
    330         TextView appSize;
    331 
    332 
    333     }
    334     /**
    335      * 判断是系统应用还是用户应用
    336      */
    337     private void isSysUserApp(){
    338         userInfo = new ArrayList<mPackageInfo>();
    339         sysInfo = new ArrayList<mPackageInfo>();
    340         for (mPackageInfo Info : appInfo) {
    341             boolean men = Info.isMen();
    342             if(men){
    343                 sysInfo.add(Info);
    344             }else{
    345                 userInfo.add(Info);
    346             }
    347         }
    348     }
    349     class MyReceiver extends BroadcastReceiver{
    350 
    351         @Override
    352         public void onReceive(Context context, Intent intent) {
    353             String packcageName=null;
    354             mPackageInfo tag=null;
    355             String data = intent.getData().toString();
    356             
    357             unregisterReceiver(this);
    358             
    359             if(data != null){
    360                 
    361                 packcageName = data.replace("package:", "");
    362             
    363             }
    364             for (mPackageInfo info : appInfo) {
    365                 
    366                 if(info.getPackageName().equals(packcageName)){
    367                     tag=info;
    368                 }
    369             }
    370             if(appInfo != null){
    371                 System.out.println("程序卸载已经更新"+tag);
    372                 appInfo.remove(tag);
    373                 isSysUserApp();
    374                 adapter.notifyDataSetChanged();
    375             }
    376             
    377         }
    378         
    379     }
    380 
    381 }
     1 package com.hb.mobilesafe.utils;
     2 
     3 import java.io.File;
     4 import java.util.ArrayList;
     5 import java.util.List;
     6 
     7 import android.content.Context;
     8 import android.content.pm.ApplicationInfo;
     9 import android.content.pm.PackageInfo;
    10 import android.content.pm.PackageManager;
    11 import android.graphics.drawable.Drawable;
    12 import android.os.SystemClock;
    13 
    14 import com.hb.mobilesafe.bean.mPackageInfo;
    15 
    16 
    17 public class PackageInfoUtil {
    18     public static List<mPackageInfo> getAppInfo(Context context){
    19         List<mPackageInfo> list=new ArrayList<mPackageInfo>();
    20 
    21         PackageManager pm = context.getPackageManager();
    22         List<PackageInfo> packages = pm.getInstalledPackages(0);
    23         for (PackageInfo info1 : packages) {
    24             mPackageInfo info = new mPackageInfo();
    25             Drawable appIcon = info1.applicationInfo.loadIcon(pm);
    26             String appName = info1.applicationInfo.loadLabel(pm).toString();
    27             String appPackageName = info1.packageName.toString();
    28             String path = info1.applicationInfo.sourceDir.toString();
    29             File file=new File(path);
    30             long appSize = file.length();
    31 
    32             int flags = info1.applicationInfo.flags;
    33             /**
    34              * 判断是否是系统应用
    35              */
    36             if((flags & ApplicationInfo.FLAG_SYSTEM)!=0){
    37                 info.setMen(true);
    38             }else{
    39                 info.setMen(false);
    40             }
    41             /**
    42              * 判断是否是安装在sd卡上的
    43              */
    44             if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE)!=0){
    45                 info.setSd(false);
    46             }else {
    47                 info.setSd(true);
    48             }
    49             info.setAppName(appName);
    50             info.setAppSize(appSize);
    51             info.setIcon(appIcon);
    52             info.setPackageName(appPackageName);
    53             list.add(info);
    54 
    55         }
    56         SystemClock.sleep(1200);
    57         return list;
    58 
    59     }
    60 }

    xml:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:gravity="center_horizontal" >
     6 
     7     <TextView
     8         android:id="@+id/tv_title"
     9         android:layout_width="match_parent"
    10         android:layout_height="46dp"
    11         android:background="#A1FF80"
    12         android:gravity="center_vertical"
    13         android:text="程序管理"
    14         android:textSize="20sp" />
    15 
    16     <RelativeLayout
    17         android:id="@+id/rl_size"
    18         android:layout_width="match_parent"
    19         android:layout_height="wrap_content"
    20         android:layout_below="@id/tv_title" >
    21 
    22         <TextView
    23             android:id="@+id/tv_rom_available"
    24             android:layout_width="wrap_content"
    25             android:layout_height="wrap_content"
    26             android:drawableLeft="@drawable/memory"
    27             android:text="机身内存可用:181MB"
    28             android:textSize="10sp" />
    29 
    30         <TextView
    31             android:id="@+id/tv_sdcard_available"
    32             android:layout_width="wrap_content"
    33             android:layout_height="wrap_content"
    34             android:layout_alignParentRight="true"
    35             android:drawableLeft="@drawable/sd"
    36             android:text="SD卡内存可用:181MB"
    37             android:textSize="10sp" />
    38     </RelativeLayout>
    39 
    40     <TextView
    41         android:visibility="gone"
    42         android:textColor="#ffffff"
    43         android:clickable="false"
    44         android:id="@+id/tv_software_count"
    45         android:layout_width="match_parent"
    46         android:layout_height="wrap_content"
    47         android:layout_below="@id/rl_size"
    48         android:background="#888888"
    49         android:text="用户程序:5"
    50          />
    51 
    52     <LinearLayout
    53         android:id="@+id/ll_progressbar"
    54         android:layout_width="wrap_content"
    55         android:layout_height="wrap_content"
    56         android:layout_centerInParent="true"
    57         android:gravity="center"
    58         android:orientation="vertical"
    59         android:visibility="invisible" >
    60 
    61         <ProgressBar
    62             android:layout_width="wrap_content"
    63             android:layout_height="wrap_content" />
    64 
    65         <TextView
    66             android:layout_width="wrap_content"
    67             android:layout_height="wrap_content"
    68             android:layout_centerInParent="true"
    69             android:text="正在加载中..."
    70             android:textSize="15sp" />
    71     </LinearLayout>
    72 
    73     <ListView
    74         android:id="@+id/lv_show_allapp"
    75         android:layout_width="match_parent"
    76         android:layout_height="match_parent"
    77         android:layout_below="@id/tv_software_count" />
    78 
    79 </RelativeLayout>
    View Code
  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/boket/p/6991756.html
Copyright © 2011-2022 走看看