赞
踩
公司一直使用的是自己写的launcher,功能比较简单,就是展示app,点击打开应用。一般来说安卓都会有长按卸载的功能,公司应该是怕客户误操作没有加,最近想自己尝试实现一下,写这篇博客记录一下实现的过程。
一、实现卸载功能
卸载app的方法很好实现,有包名,发送Intent动作即可,卸载app的动作是ACTION_DELETE,为了实际操作方便,将其写成了一个弹窗,弹出点击即可卸载
private void showNormalDialog(String pn){ /* @setIcon 设置对话框图标 * @setTitle 设置对话框标题 * @setMessage 设置对话框消息提示 * setXXX方法返回Dialog对象,因此可以链式设置属性 */ final AlertDialog.Builder normalDialog = new AlertDialog.Builder(getContext()); normalDialog.setIcon(R.drawable.ic_uninstall_no_shadow); normalDialog.setCancelable(true); normalDialog.setMessage(R.string.uninstall_drop_target_label); normalDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String PackageName = "package:" + pn; Uri packageURI = Uri.parse(PackageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); Utils.startActivitySafely(getContext(),uninstallIntent); dialog.dismiss(); } }); normalDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); // 显示 normalDialog.show(); }
二、找到app点击事件处理的代码位置,添加长按点击事件
不同的launcher可能实现的方法有所差异,但是大致流程是差不多的:
我这边先找到的是onItemClick 方法,查看此类,是用于展示所有app的,此时只实现了OnItemClickListener点击事件的监听
public class AllApps extends FrameLayout implements AdapterView.OnItemClickListener, IAllApps {
我们需要的是对长按点击事件进行监听
找到AdapterView类,发现里面有个OnItemLongClickListener方法,从描述中可以看出这就是长按事件监听的方法,在AllApps中实现它
public class AllApps extends FrameLayout implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener ,IAllApps {
还要实现它的抽象方法public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
在onItemLongClick中,我们监听到长按事件,即弹出之前所写的弹窗。
我们的app是分为系统app和第三方app的,其中系统app不可被卸载,因此需要对点击的app做区分,只有第三方app才弹出弹窗,区分是否系统app的方法在ApplicationInfo类中有实现,flags不等于FLAG_UPDATED_SYSTEM_APP或等于FLAG_SYSTEM时,即为第三方app
@Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { AppInfo app = (AppInfo) parent.getItemAtPosition(position); PackageManager Pm = view.getContext().getPackageManager(); String PackageName = app.componentName.getPackageName(); Log.e(">>>nice ", "getPackageName: "+PackageName); try{ ApplicationInfo applicationInfo = Pm.getApplicationInfo(PackageName, 0); if ((applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { showNormalDialog(PackageName); } else if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { showNormalDialog(PackageName); } } catch(Exception e){ System.out.println("Wrong!"); } return true; }
写到这里就差不多完成我们需要的功能了,还需要在app的view上设置我们的长按事件监听,否则事件不会被响应grid.setOnItemLongClickListener(this);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。