launcher 实现长按卸载app

公司一直使用的是自己写的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);

    原文作者:yjl1023
    原文地址: https://blog.csdn.net/yjl1023/article/details/122139565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞