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