android 在清除应用数据后,会重复生成shortcut

来源:互联网 发布:爱宝v6软件 编辑:程序博客网 时间:2024/05/17 09:04

      最近测试发现一个bug,在应用程序信息页面,点击清除数据后,然后打开该应用,发现桌面又创建了一个shortcut,很显然shortcut重复了。于是赶紧去分析bug产生的原因:我们的应用程序主页会有一个判断ShortCutFlag的过程,如果返回false,则会创建。而ShortCutFlag是记录在SharedPreferences中,清除应用数据时,也会把SharedPreferences清除,导致会重复创建shortcut,而此时系统应该能够判断是否已创建,我们是否有参数来设置不允许重复创建shortcut呢,创建shortcut的代码如下

public static void addShortcut(Context cx) {    Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");    Intent shortcutIntent = cx.getPackageManager().getLaunchIntentForPackage(cx.getPackageName());    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);    String title = null;    try {        final PackageManager pm = cx.getPackageManager();        title = pm.getApplicationLabel(pm.getApplicationInfo(cx.getPackageName(),PackageManager.GET_META_DATA)).toString();    } catch (Exception e) {    }    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);    shortcut.putExtra("duplicate", false);    Parcelable iconResource = Intent.ShortcutIconResource.fromContext(cx,R.drawable.ic_launcher);    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);    cx.sendBroadcast(shortcut);}
    

      其中shortcut.putExtra("duplicate", false) 就设置不允许重复,似乎没起作用。多调用cx.sendBroadcast(shortcut)几次就会出现多生成几个shortcut。
于是只能寻找其他办法来判断是否已生成shortcut,经过测试以下方法有效

     1.修改addShortCut

    public static void addShortcut(Context cx) {        String title = null;    try {        final PackageManager pm = cx.getPackageManager();        title = pm.getApplicationLabel(pm.getApplicationInfo(cx.getPackageName(),PackageManager.GET_META_DATA)).toString();    } catch (Exception e) {    }        if(hasShortcut(cx ,title)){            return;        }else {            Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");            Intent shortcutIntent = cx.getPackageManager().getLaunchIntentForPackage(cx.getPackageName());            shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);            shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);            shortcut.putExtra("duplicate", false);            Parcelable iconResource = Intent.ShortcutIconResource.fromContext(cx, R.drawable.ic_launcher);            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);            cx.sendBroadcast(shortcut);        }    }
    2.增加hasShortCut来判断是否创建已创建shortcut

    private static boolean hasShortcut(Context context,String shortcutName){        String url = "";        int systemversion = Build.VERSION.SDK_INT;        /*大于8的时候在com.android.launcher2.settings 里查询*/        if(systemversion < 8){            url = "content://com.android.launcher.settings/favorites?notify=true";        }else{            url = "content://com.android.launcher2.settings/favorites?notify=true";        }        try {            ContentResolver resolver = context.getContentResolver();            Cursor cursor = resolver.query(Uri.parse(url), null, "title=?", new String[]{shortcutName}, null);            if (cursor != null && cursor.moveToFirst()) {                cursor.close();                return true;            }        }catch (Exception e) {        }        return false;    }
 

  注: 需要增加<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>

      否则“Cursor cursor = resolver.query(Uri.parse(url), null, "title=?",new String[] {shortcutName}, null)”

      会卡住。。。


  注: 可以让addShortCut在单独的线程中执行。





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子的语文不好怎么办 数学一直学不好怎么办 小孩数学成绩差怎么办 理科生语文不好怎么办 小学阅读题不好怎么办 如果孩子考不好怎么办 6岁不认识数字怎么办 数学一点都不会怎么办 初一数学太差怎么办 三年级孩子数学差怎么办 三年级孩子数学很差怎么办 初中学习不好高中怎么办 四年级孩子数学不好怎么办 孩子学习不开窍怎么办 孩子学习太笨怎么办 老师是个小人怎么办 孩子写字太差怎么办 孩子写字下手重怎么办 孩子一年级数学不好怎么办 孩子数学理解能力差怎么办 智商情商都低怎么办 一年级孩子数学很差怎么办 一年级孩子数学差怎么办 一年级数学学不好怎么办 孩子成绩差该怎么办 小学生数学太差怎么办 小学数学基础差怎么办 孩子一年级学习不好怎么办 快两岁的宝宝老尿裤怎么办 戒母乳宝宝哭闹怎么办 三周岁不肯说话怎么办 两岁宝宝打人怎么办 刚开始跳绳腿疼怎么办 两周岁宝宝拉肚子怎么办 宝宝睡觉认人怎么办 宝宝脸不光滑怎么办 两周岁宝宝打人怎么办 分手后想念前任怎么办 孩子不学习该怎么办 小孩吃了牙膏怎么办 小孩子吃了牙膏怎么办