自己动手写一个APK安装器(二)

接上回...

 

四、细节要点:

 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了,代码写的不好的地方请指正,不清楚的地方请留言哦。

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值