当前位置:   article > 正文

launcher 实现长按卸载app_android 拖拽卸载应用

android 拖拽卸载应用

公司一直使用的是自己写的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();
	} 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

二、找到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 {
  • 1

还要实现它的抽象方法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;
    }
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

写到这里就差不多完成我们需要的功能了,还需要在app的view上设置我们的长按事件监听,否则事件不会被响应grid.setOnItemLongClickListener(this);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/296511
推荐阅读
相关标签
  

闽ICP备14008679号