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);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值