接上回...
四、细节要点:
1.由于SDCard上面的APK文件可能会很多,加之封装的时候要读取文件的内容,扫描过程会很耗时,所以这里需要用到AsyncTask,代码如下
private class ScanAPKFileTask extends AsyncTask<String, Void, String> { private Context context; public ScanAPKFileTask(Context context) { this.context = context; } @Override protected String doInBackground(String... params) { FileHelper fh = new FileHelper(context); apkFileList = fh.scanAllAPKFile(); return null; } protected void onPostExecute(String err) { try { progressDialog.dismiss(); progressDialog = null; } catch (Exception e) { e.printStackTrace(); } if (apkFileList != null) { //Log.v(LOG_TAG, "apk files count: " + apkFileList.size()); APKListAdapter apkListAdapter = new APKListAdapter(apkFileList, MainActivity.this); apkListView.setAdapter(apkListAdapter); } leftTextView.setBackgroundResource(R.drawable.b); } }
doInBackground(Params...)负责执行很耗时的后台计算工作;
onPostExecute(Result)在doInBackground(Params...)执行完后被调用。
2.ListView和BaseAdapter的配合使用,ListView里面显示的数据由万能的BaseAdapter提供,每一个ListViewItem被定义为一个单独的xml文件,BaseAdapter负责向里面填充数据,部分关键代码如下示
public View getView(int position, View convertView, ViewGroup parent) { ListItemView listItemView; if(convertView == null){ convertView = mLayoutInflater.inflate(R.layout.list_item, null); listItemView = new ListItemView(); listItemView.iconImageView = (ImageView) convertView.findViewById(R.id.icon); listItemView.appNameText = (TextView) convertView.findViewById(R.id.text11); listItemView.packageNameText = (TextView) convertView.findViewById(R.id.text22); convertView.setTag(listItemView); }else{ listItemView = (ListItemView)convertView.getTag(); } APKFileModel apkFileModel = apkFileList.get(position); Drawable iconImage = apkFileModel.getIcon(); String appName = apkFileModel.getAppName(); String packageName = apkFileModel.getPackageName(); listItemView.iconImageView.setImageDrawable(iconImage); listItemView.appNameText.setText(appName); listItemView.packageNameText.setText(packageName); return convertView; }
这里返回的convertView就是ListView的每一项ItemView。
3.执行完卸载程序操作后返回到安装器界面,需要在ListView里面删除相应的Item,我的做法是这样的在调用系统卸载程序的时候首先记下该项的index、packagename,并设置一个标志键,如下
unInstallPackageName = packageName; unInstallIndex = arg2; unInstallReturn = true;
通过对Activity的生命周期的了解,应该在OnRestart()方法里面做刷新工作,代码如下
@Override protected void onRestart() { super.onRestart(); if(unInstallReturn){ refreshInstalledAppListView(); unInstallReturn = false; } }
刷新的工作就交给方法refreshInstalledAppListView(),代码如下
private void refreshInstalledAppListView() { try { getPackageManager().getPackageInfo(unInstallPackageName, 0); } catch (NameNotFoundException e) { if(installedAppInfoList != null && installedAppListAdapter != null && unInstallIndex >= 0){ installedAppInfoList.remove(unInstallIndex); installedAppListAdapter.notifyDataSetChanged(); unInstallIndex = -1; } } }
通过包名去获取PackageInfo,如果发生NameNotFound异常就说明该应用已经被删除。
至此,APK安装器基本功能已经OK了,代码写的不好的地方请指正,不清楚的地方请留言哦。