精华内容
下载资源
问答
  • Android创建快捷方式

    2015-06-19 10:40:46
    为应用创建快捷方式目前有两种方法: 1. 程序启动时主动添加快捷方式到桌面------------>主动添加 2.长按桌面,弹出应用选择窗,拖动应用到桌面---------->被动添加 公用方法: [java] ...

    为应用创建快捷方式目前有两种方法:

    1. 程序启动时主动添加快捷方式到桌面------------>主动添加

    2.长按桌面,弹出应用选择窗,拖动应用到桌面---------->被动添加


    公用方法:

    [java] view plaincopy
    1. /** 
    2.  
    3.       * 返回添加到桌面快捷方式的Intent:   
    4.  
    5.       * 1.给Intent指定action="com.android.launcher.INSTALL_SHORTCUT" 
    6.  
    7.       * 2.给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)   
    8.  
    9.       * 3.添加权限:com.android.launcher.permission.INSTALL_SHORTCUT 
    10.  
    11.       */  
    12.   
    13.      public static Intent getShortcutToDesktopIntent(Context context) {  
    14.          Intent intent = new Intent();   
    15.          intent.setClass(context, context.getClass());    
    16.         /*以下两句是为了在卸载应用的时候同时删除桌面快捷方式*/  
    17.          intent.setAction("android.intent.action.MAIN");    
    18.          intent.addCategory("android.intent.category.LAUNCHER");    
    19.           
    20.          Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");  
    21.          // 不允许重建  
    22.          shortcut.putExtra("duplicate"false);  
    23.          // 设置名字  
    24.          shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,context.getString(R.string.app_name));  
    25.          // 设置图标  
    26.          shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(context, R.drawable.ic_launcher));  
    27.          // 设置意图和快捷方式关联程序  
    28.          shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent);  
    29.   
    30.          return shortcut;  
    31.   
    32.      }  


    一、主动添加方式:

     1. 在AndroidManifest.xml中添加权限:

    [java] view plaincopy
    1. <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>  

    2. 在启动Activity中发送广播:

    [java] view plaincopy
    1. sendBroadcast(getShortcutToDesktopIntent(MainActivity.this));  


    二、被动添加方式:

    1.在AndroidManifest.xml中添加权限:

    [java] view plaincopy
    1. <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>  

    2.在AndroidManifest.xml中为主Activity添加action监听:

    [java] view plaincopy
    1. <!-- 如果是通过桌面长按添加快捷方式,才需要添加此配置 -->  
    2.             <intent-filter>    
    3.               <action android:name="android.intent.action.CREATE_SHORTCUT" />    
    4.               <category android:name="android.intent.category.DEFAULT" />    
    5.           </intent-filter>    

    3.在启动Activity中添加广播监听:

    [java] view plaincopy
    1. final Intent launchIntent = getIntent();  
    2.         final String action = launchIntent.getAction();  
    3.         if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {  
    4.             Log.i(TAG, "create shortcut method one---------------- ");  
    5.             setResult(RESULT_OK, ShortcutUtils.getShortcutToDesktopIntent(MainActivity.this));  
    6.               
    7.             finish();  
    8.         }   

    三、删除快捷方式:

    1.在AndroidManifest.xml中添加权限:

    [java] view plaincopy
    1. <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>  

    2.代码:

    [java] view plaincopy
    1. /** 
    2.       * 删除快捷方式 
    3.       * */  
    4.      public static void deleteShortCut(Context context)  
    5.      {  
    6.         Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");    
    7.         //快捷方式的名称    
    8.         shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,context.getString(R.string.app_name));    
    9.         /**删除和创建需要对应才能找到快捷方式并成功删除**/  
    10.         Intent intent = new Intent();   
    11.         intent.setClass(context, context.getClass());    
    12.         intent.setAction("android.intent.action.MAIN");    
    13.         intent.addCategory("android.intent.category.LAUNCHER");    
    14.           
    15.         shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent);    
    16.         context.sendBroadcast(shortcut);            
    17.      }  


    四、判断快捷方式是否已创建(该方法不起作用,方法中有说明和解决方案):

    1.添加权限:

    [java] view plaincopy
    1. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>  

    2.代码:

    [java] view plaincopy
    1. /** 
    2.       * 判断是否已添加快捷方式:   
    3.       * 暂时没有方法能够准确的判断到快捷方式,原因是, 
    4.         1、不同厂商的机型他的快捷方式uri不同,我遇到过HTC的他的URI是content://com.htc.launcher.settings/favorites?notify=true 
    5.         2、桌面不只是android自带的,可能是第三方的桌面,他们的快捷方式uri都不同 
    6.          
    7.         提供一个解决办法,创建快捷方式的时候保存到preference,或者建个文件在SD卡上,下次加载的时候判断不存在就先发删除广播,再重新创建 
    8.  
    9.       * 添加权限:<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" ></uses-permission> 
    10.  
    11.       */  
    12.      public static boolean hasInstallShortcut(Context context) {  
    13.          boolean hasInstall = false;  
    14.   
    15.          String AUTHORITY = "com.android.launcher.settings";  
    16.          int systemversion = Build.VERSION.SDK_INT;  
    17.          Log.i("Build.VERSION.SDK==========>", systemversion + "");  
    18.          /*大于8的时候在com.android.launcher2.settings 里查询(未测试)*/  
    19.          if(systemversion >= 8){   
    20.              AUTHORITY = "com.android.launcher2.settings";   
    21.          }   
    22.          Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY  + "/favorites?notify=true");  
    23.   
    24.          Cursor cursor = context.getContentResolver().query(CONTENT_URI,  
    25.                  new String[] { "title" }, "title=?",  
    26.                  new String[] { context.getString(R.string.app_name) }, null);  
    27.   
    28.          if (cursor != null && cursor.getCount() > 0) {  
    29.              hasInstall = true;  
    30.          }  
    31.   
    32.          return hasInstall;  
    33.      }  

    原文链接

    http://blog.csdn.net/jjmm2009/article/details/37902949

    展开全文
  • Android创建快捷方式

    千次阅读 2015-07-02 19:50:32
    Android创建快捷方式是很普遍的,是增加流量的一种方式。如果是原生系统,直接调用系统API就行了,但是众多厂商都有自己定制的桌面(Launcher),因此导致在适配、兼容方面存在很多问题。暂时虽然没有办法搞定...

    在Android中创建快捷方式是很普遍的,是增加流量的一种方式。如果是原生系统,直接调用系统API就行了,但是众多厂商都有自己定制的桌面(Launcher),因此导致在适配、兼容方面存在很多问题。暂时虽然没有办法搞定所有的,但是仍然需要寻求一个最优的方案。

    一、简单实现

    增加快捷方式,这个需要在manifest文件中添加权限:

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>

    具体实现:

    /**
         * 创建快捷方式
         * 
         * @param name
         * @param icon
         * @param intent
         */
        public void installShortCut(String name, int icon, Intent intent) {
            Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
    
            // 快捷方式的名称
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
            shortcut.putExtra("duplicate", false); // 不允许重复创建
    
            // 快捷方式的图标
            ShortcutIconResource iconRes = ShortcutIconResource.fromContext(mContext, icon);
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
    
            intent.setAction("android.intent.action.MAIN");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标
            intent.addCategory("android.intent.category.LAUNCHER");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
    
            mContext.sendBroadcast(shortcut);
        }
    删除快捷方式也很简单,添加权限:
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
    具体实现:
    /**
         * 删除桌面快捷方式
         * @param context
         * @param shortcutName
         * 快捷方式名
         * @param actionIntent
         * 快捷方式操作,也就是上面创建的Intent
         * @param isDuplicate
         * 为true时循环删除快捷方式(即存在很多相同的快捷方式)
         */
        public static void deleteShortcut(Context context , String shortcutName ,
                                          Intent actionIntent , boolean isDuplicate) {
            Intent shortcutIntent = new Intent ("com.android.launcher.action.UNINSTALL_SHORTCUT");
            shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME ,shortcutName);
            shortcutIntent.putExtra("duplicate" , isDuplicate);
            shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT , actionIntent);
            context.sendBroadcast(shortcutIntent);
        }
    修改快捷方式,需要增加权限:
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
    如果适配所有桌面,需要加上下面所列出的权限,这些权限不一定全,个别手机还是没有涵盖。
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
        <uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS" />
        <uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" />
        <uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS" />
        <uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS" />
        <uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS" />
        <uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" />
        <uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS" />
        <uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS" />
        <uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA" />

    最后加上一个判断快捷方式是否存在的方法:

    public String getLauncherPackageName(Context context) {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            ResolveInfo res = context.getPackageManager()
                    .resolveActivity(intent, 0);
            if (res.activityInfo == null) {
                return "";
            }
            if (res.activityInfo.packageName.equals("android")) {
                return "";
            } else {
                return res.activityInfo.packageName;
            }
        }
    
        public boolean hasShortcut(String name) {
            String url;
    
            String packageName = getLauncherPackageName(mContext);
            if (packageName == null || packageName.equals("")
                    || packageName.equals("com.android.launcher")) {
                int sdkInt = android.os.Build.VERSION.SDK_INT;
                if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的
                    packageName = "com.android.launcher.settings";
                } else if (sdkInt < 19) {// Android 4.4以下
                    packageName = "com.android.launcher2.settings";
                } else {// 4.4以及以上
                    packageName = "com.android.launcher3.settings";
                }
            }
    
            url = "content://" + packageName + ".settings/favorites?notify=true";
            try {
                ContentResolver resolver = mContext.getContentResolver();
                Cursor cursor = resolver.query(Uri.parse(url), new String[] {
                                "title", "iconResource" }, "title=?",
                        new String[] { name }, null);
                if (cursor != null && cursor.getCount() > 0) {
                    return true;
                }
    
            } catch (Exception e) {
                if (e != null) {
                    e.printStackTrace();
                }
    
            }
            return false;
        }

    工具类地址:https://github.com/xuwt/Utils/blob/master/LauncherUtils.java

    参考:http://blog.zanlabs.com/2015/03/14/android-shortcut-summary/

    展开全文
  • 这里的快捷键,是Android应用生成桌面快捷方式。试想,有一Windows用户想进入D盘——my文件夹里面的子文件去找文件(因藏了些晦涩资源所以层级较深)。那么这位少侠更加便利省力的操作是:点击选中文件...

    本文已独家授权 郭霖 ( guolin_blog) 公众号发布!

    申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V;也不是IDE里Ctrl+D、Ctrl+F等常用快捷键。这里的快捷键,是Android应用生成桌面快捷方式。

    试想,有一Windows用户想进入D盘——my文件夹里面的子文件去找文件(因藏了些晦涩资源所以层级较深)。那么这位少侠更加便利省力的操作是:点击选中文件夹——右键:发送到——桌面快捷方式,即可帮他将快捷方式生成到桌面。该用户下次想使用这个文件夹,直接点击桌面上的快捷方式即可。好处在于,用户可以快速定位到某一应用具体的功能、干净利落。

    当然,谷歌Android团队也考虑了这一点,给我们设计了原生API,方便我们开发人员更加便利的(Ctrl+C、V)生成桌面快捷方式。这样做的好处我想有以下几点,首先,提高了用户留存率,试想一个APP通过某种媒介生成了2个icon,这样是很容易吸引人的,因为生成桌面快捷方式的icon以及点击事件都是代码可控的,比如你的快捷方式的icon是一个萝莉或者御姐;正太或是直男?毕竟图片总有人会喜欢的嘛。其次,快捷方式的点击事件是控制的,跳转的界面控制在开发者(产品)手中等等。

    言归正传,既然是生成桌面快捷方式,那么肯定需要权限,必要的权限如下:

    接着,因为Android难以言表的碎片化和厂商定制,所以还需要加一些权限来增加健壮性,下面直接copy就行:

    好了,权限已经添加完毕,下面就可以上代码了,首先是创建桌面快捷方式:

    //创建桌面快捷方式

    private void createShortCut(){

    //创建Intent对象

    Intent shortcutIntent = new Intent();

    //设置点击快捷方式,进入指定的Activity

    //注意:因为是从Lanucher中启动,所以这里用到了ComponentName

    //其中new ComponentName这里的第二个参数,是Activity的全路径名,也就是包名类名要写全。

    shortcutIntent.setComponent(new ComponentName(this.getPackageName(), "这里是包名.类名"));

    //给Intent添加 对应的flag

    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS|Intent.FLAG_ACTIVITY_NEW_TASK);

    Intent resultIntent = new Intent();

    // Intent.ShortcutIconResource.fromContext 这个就是设置快捷方式的图标

    resultIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,

    Intent.ShortcutIconResource.fromContext(this,

    R.drawable.yuanbao));

    //启动的Intent

    resultIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);

    //这里可以设置快捷方式的名称

    resultIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "快捷名称");

    //设置Action

    resultIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

    //发送广播、通知系统创建桌面快捷方式

    sendBroadcast(resultIntent);

    }

    创建桌面快捷方式的代码,理论上就是上面这些,ComponentName这个类用的较少,简单理解ComponentName的作用是,可以启动其他应用的Activity、Service(前提是要知道包名),然后搭配Intent使用,完成跳转。关于ComponentName与Activity、Service的参考代码如下:

    ComponentName componentName = new ComponentName(param1,param2);

    param1:Activity、Service 所在应用的包名

    //获取应用的包名可以通过 this.getPackageName(); this代表当前的Activity

    param2:Activity、Service的包名+类名

    //这里是全路径名:对应的就是 this.getPackageName()+"YourActivity"

    //this.getPackageName()+"YourService"

    //ComponentName结合Activity的写法如下:

    ComponentName componentName = new ComponentName(this.getPackageName(), this.getPackageName()+"YourActivity");

    Intent intent =new Intent();

    intent.setComponent(componentName);

    startActivity(intent);

    //ComponentName结合Service的写法如下:

    ComponentName componentName = new ComponentName(this.getPackageName(), this.getPackageName()+"YourService");

    Intent intent = new Intent();

    intent.setComponent(componentName);

    startService(intent);

    另外,还需要在清单配置文件里面,对应的Activity和Service需要加上android:exported = "true",这个android:exported标签,是用来指示该服务是否能够被其他应用程序组件调用或跟它交互。设置成true,则能够被调用或交互;设置false,也就意味不能被其他组件交互。APP入口的Activity不声明默认就是android:exported="true"。关于ComponentName的说明就到此为止,还不是很好理解的可以自行谷歌百度。综上,还需要在清单文件配置一些代码,参考如下:

    android:exported="true"

    android:excludeFromRecents="true"

    android:name=".TestCreatIconActivity">

    android:name=".MainActivity"

    android:exported="true"

    android:excludeFromRecents="true"

    >

    这里的MainActivity,就是我点击快捷方式进入的Activity。可能你会说,我该如何传值给,快捷方式点进去的Activity?那么也是传统套路根据Intent来传值,也就是上面的shortcutIntent,参考代码如下:

    //传参到指定界面,通过标识和具体数据执行

    shortcutIntent.putExtra("key1","xxx");

    shortcutIntent.putExtra("key2",true);

    shortcutIntent.putExtra("key3",233);

    ...

    好了,创建快捷方式的代码是通过sendBroadcast(resultIntent);来实现的,因此可以判断这是系统的广播。

    删除桌面快捷方式:

    首先,用户可以直接在手机桌面拖拽快捷方式,进行删除

    另外,上面的代码也实现了当删除APK以后,自动删除快捷方式(因为你跳转没有了目标,所以需要删除)由于代码删除快捷方式,网上的一些代码都有问题(又是令人无语的碎片化和厂商定制),所以这里不提供删除快捷方式的代码,理论上,上面2种手动删除实现即可。

    值得注意的是,如果用户没有手动打开权限,也会创建失败,也需要提示用户手动对应用进行快捷方式权限授权设置。

    Android 7.1系统快捷方式的变化:

    从Android 7.1(API 25,也就是 minSdkVersion 25 )开始,新增了ShortcutManager,ShortcutManager,顾名思义,翻译过来就是快捷方式管理。

    这个类可以对桌面久按应用图标弹出的快捷方式进行管理。

    那么ShortcutManager的实现方式有2种:

    第一种:XML注册

    首先, 需要在res/xml目录下创建一个新的xml文件,根标签是shortcuts,参考代码如下:

    android:shortcutId="setting"

    android:enabled="true"

    android:icon="@drawable/yuanbao"

    android:shortcutShortLabel="@string/set_short_name"

    android:shortcutLongLabel="@string/set_long_name"

    android:shortcutDisabledMessage="@string/set_disable_msg">

    android:action="android.intent.action.VIEW"

    android:targetPackage="com.share.shortcut"

    android:targetClass="com.share.shortcut.TargetActivity" />

    嗯,可以看到新增了很多标签,这些标签代表什么意思咧?首先是shortcut的外部标签:

    shortcutId, 快捷方式的id

    enabled:表示这个shortcut是否可用,一般设置为true即可

    shortcutShortLabel:配置快捷方式的短名称, 如果长名称显示不下, 就显示短名称

    shortcutLongLabel: 配置快捷方式的长名称, launcher会优先选择长名称显示(优先级高于shortcutShortLabel)

    shortcutDisabledMessage:这个标签的意思是指:当我们点击一个不可用的shortcut时,给用户一个有效提示

    内部还有个intent标签:

    android:action,这里的action需要配置,否则会崩溃,默认写法是android.intent.action.VIEW

    targetPackage:目标应用的包名,

    targetClass:点击快捷方式要跳转的目标类, 这里要注意的是android:action一定要配置, 否则会崩溃

    categories:这个标签谷歌团队仅提供了android.shortcut.conversation 这一种,所以直接复制即可

    好了,现在通过XML已经写好了快捷方式,那现在该如何使用,让快捷方式生效?

    那么,只需要在清单文件中启动Activity的里面,加入以下2行代码(也就是通过meta-data配置进去)即可看到效果:

    android:launchMode="singleInstance"

    android:name=".MainActivity"

    android:excludeFromRecents="true"

    >

    静态注册

    android:name="android.app.shortcuts"

    android:resource="@xml/shortcut"/>

    这里的meta-data就是配置了桌面快捷方式的一些信息。代码运行后,执行创建快捷方式的操作即可看到效果:

    1d16c3a04593

    7.1系统效果图

    说完了第一种XML注册在来说第二种注册:代码动态注册

    首先,获取系统服务,固定写法:getSystemService(ShortcutManager.class);获取ShortcutManager类对象

    接着,获取完ShortcutManager对象以后,通过setDynamicShortcuts( List )方法去设置Shortcut快捷方式具体的名字、icon以及逻辑。

    既然,现在要通过ShortcutInfo去完成信息填充,那么我们就先看下ShortcutInfo的基本写法:

    //获取系统服务得到ShortcutManager对象

    ShortcutManager systemService = getSystemService(ShortcutManager.class);

    if (Build.VERSION.SDK_INT >= 25) {

    //设置Intent跳转逻辑

    Intent intent = new Intent(ShortCut7_0Activity.this, TargetActivity.class);

    intent.setAction(Intent.ACTION_VIEW);

    //设置ID

    ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(this, "onlyId")

    //设置短标题

    .setShortLabel("雅蠛蝶")

    //设置长标题

    .setLongLabel("江山留胜迹")

    //设置icon

    .setIcon(Icon.createWithResource(this, R.drawable.yuanbao))

    //设置Intent

    .setIntent(intent)

    .build();

    //这样就可以通过长按图标显示出快捷方式了

    systemService.setDynamicShortcuts(Arrays.asList(shortcutInfo));

    以上代码就可以创建桌面快捷方式,通过ShortcutInfo的Builder写法可以动态的插入快捷方式的名称、icon、以及Intent逻辑。值得一提的是,ShortcutManager最大可以创建5个,但桌面上只能最多只能显示4个快捷方式,可能是谷歌团队基于何种情况的考虑进行的限制,这里就不做深入研究。另外,快捷方式的顺序排列是:前面添加的显示在下方,后面添加的显示在上面。

    1d16c3a04593

    7.1系统多快捷方式效果图

    另外,移除快捷方式可以调用如下API:

    void removeDynamicShortcuts(@NonNull List shortcutIds);

    Android 8.0系统快捷方式的变化:

    可能是谷歌出新版本需要优化增加既有版本的一些功能从Android 8.0(API 26,也就是 minSdkVersion 26,也就是Android O )开始,对ShortcutManager这个类新增了更多的管理措施。

    那么O系统主要的扩充说明有那些?我这里就简单说明下,

    一:

    APP可以使用requestPinShortcut(ShortcutInfo,IntentSender)将现有的快捷方式(静态或动态)或全新的快捷方式固定到支持的启动器。这俩参数的意思是:

    ShortcutInfo对象 - 如果快捷方式已存在,则该对象仅包含快捷方式的ID。如果快捷方式不存在,新的ShortcutInfo对象必须包含新快捷方式的ID,意图和短标签。

    PendingIntent对象 - 此意图表示如果快捷方式成功固定到设备的启动器,您的应用程序将收到回调。

    分析:也就是说,谷歌要求新的快捷方式需要编写的严谨,然后该快捷方式是否固定到设备加了新的判断标准

    二:

    由于Android O中引入的后台执行限制,最好使用清单声明的接收器来接收回调。

    另外,为了防止其他应用程序调用接收器,需要将属性赋值android:exported =“false”添加到接收者的清单条目中。

    分析:针对O系统对于服务的严格限制,这是对快捷方式功能的扩充

    三:

    并不是所有的启动器都支持固定快捷方式!!!所以,如果要确定该APP是否支持国定快捷方式,可以使用isRequestPinShortcutSupported()这个方法的返回值。

    根据返回值,可以决定隐藏App中允许,用户固定快捷方式的选项。该方法返回TRUE,则意味着,桌面支持requestPinShortcut;

    但是用户也可能会更改,更改选项以后,再次启动APP返回值可能就会发生变化。另外,系统版本低于Android O,那么它支持使用旧的私有意图com.android.launcher.action.INSTALL_SHORTCUT。

    requestPinShortcut这个方法请求创建固定的快捷方式。默认启动器将收到该请求,并要求用户批准。如果用户批准,将创建快捷方式,并且将发送resultIntent。但是,如果请求被用户拒绝,则不会向呼叫者发送任何响应。需要注意的是,只有具有前台活动或前台服务的应用程序才能调用此方法。否则,它将抛出IllegalStateException。

    分析:也就是说,这种启动器的固定快捷方式能否成功很大程度跟用户的操作密切相关(这个可以跟产品吹一波了)。另外可以看到O系统对于服务的严格控制,严格控制后台服务需要使用前台服务的举措在于让应用更加安全(因此IntentService在新版本上要慎用。当然谷歌在开发者文档上针对后台服务这一问题也给了对应的解决办法),这也看到了谷歌技术团队对后续版本使用应用安全的决心。

    综上:可以有以下代码

    @RequiresApi(api = Build.VERSION_CODES.O)

    public static void testShortCut(Context context) {

    ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);

    boolean requestPinShortcutSupported = shortcutManager.isRequestPinShortcutSupported();

    Log.i(TAG, "启动器是否支持固定快捷方式: "+requestPinShortcutSupported);

    if (requestPinShortcutSupported) {

    Intent shortcutInfoIntent = new Intent(context, TargetActivity.class);

    shortcutInfoIntent.setAction(Intent.ACTION_VIEW);

    ShortcutInfo info = new ShortcutInfo.Builder(context, "tzw")

    .setIcon(Icon.createWithResource(context, R.drawable.yuanbao))

    .setShortLabel("O系统短")

    .setLongLabel("O系统长")

    .setIntent(shortcutInfoIntent)

    .build();

    //当添加快捷方式的确认弹框弹出来时,将被回调CallBackReceiver里面的onReceive方法

    PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, CallBackReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

    shortcutManager.requestPinShortcut(info, shortcutCallbackIntent.getIntentSender());

    }

    }

    class CallBackReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

    Log.i(TAG, "onReceive: 固定快捷方式的回调");

    }

    }

    下面是应用启动后,Android Studio自带8.0模拟器,首先创建快捷方式的逻辑顺序:

    1d16c3a04593

    O系统启动器快捷方式

    点击ADD...以后,我们的应用就显示这样了,可以看到快捷方式向卫星一样挂靠在应用icon上面:

    1d16c3a04593

    允许之后

    如果点击CANCEL,那么就没有创建,退出以后icon还是原样,当我们第二次打开应用,选择申请桌面快捷方式的时候,又会弹出上面的申请界面。

    这篇博客花了一些时间,因为要考虑三种不同情况(如果想要看到三种情况的效果,需要手动更改 minSdkVersion版本号、以及对应版本的模拟器资源,或者根据系统版本号进行自行判断),如果写的不好或者有任何问题可以直接在评论区或者github指出。

    如果这篇文章对您有开发or学习上的些许帮助,希望各位看官留下宝贵的star,谢谢。

    Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

    展开全文
  • -- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <!-- 移除快捷方式 --> <uses-permission android:name=...

    权限:

    <!-- 添加快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <!-- 移除快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
    

    代码:

    public void cs() {
        Intent.ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.a);
        Intent intentLauncher = new Intent();
        intentLauncher.setAction("android.intent.action.VIEW");
        // intentLauncher.setClass() 如果启动的不是本应用的Activity则会导致卸载应用时不会删除快捷方式,它的作用是指定快捷方式点击之后会执行什么操作
        Intent intentAddShortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
        // 是否允许重复创建快捷方式
        intentAddShortcut.putExtra("duplicate", false);
        // 快捷方式名称
        intentAddShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "111");
        // 快捷方式图标                 intentAddShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
        intentAddShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intentLauncher);
        sendBroadcast(intentAddShortcut);
    }
    

    关于兼容性:

    此处还有一个问题,是关于隐藏应用图标的(上篇博客),Oppo A31手机隐藏主图标后会将其创建出来的快捷方式一同隐藏。经测试,问题出在 intentLauncher.setClass() 上,如果启动是本应用的Activity则会出现上述结果,如果不是本应用的Activity则不会隐藏,原因目前未知。求大神告知!

    展开全文
  • 创建快捷方式app是专为安卓手机用户制作的快捷方式创建工具,软件可以帮助用户轻松一键创建快捷方式,更便捷智慧使用手机,需要的朋友可以前来下载使用。创建快捷方式app使用说明:先选择一个应用,再选择应用里的...
  • uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /&gt; 以下是全部代码:   package shortcut.demo; import android.app.Activity; import android....
  •  * 创建快捷方式  */  private void shortCut() {  // TODO Auto-generated method stub  Intent shortcut = new Intent(  "com.android.launcher.action.INSTALL_SHORTCUT");  // 设置属性  ...
  • android创建快捷方式

    2016-05-01 12:54:24
    更多快捷方式创建方式请参考:... *创建一个可以快速打电话的快捷方式 */ public class CallShortCutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanc
  • Android创建桌面快捷方式

    千次阅读 2015-12-29 19:54:44
    Android创建桌面快捷方式 如果我们手机用的是比较原生的Android系统,那么我们安装应用以后,要点击应用页面,才能找到我们的... 添加创建快捷方式的权限<uses-permission android:name="com.android.launcher.perm
  • 主要介绍了Android程序开发之手机APP创建桌面快捷方式 的相关资料,需要的朋友可以参考下
  • Android应用创建手机桌面快捷方式

    千次阅读 2015-04-14 09:51:33
    xmlns:tools="http://schemas.android.com/tools" ... android:layout_width="match_parent"  android:layout_height="match_parent" android:orientation="vertical">    android:id="@+id/short
  • 我们开发一款软件后,如果手机装的软件过多,去翻的话会很难翻的,所以,在主页面有一个快捷方式的话会很不错的,下面是详细代码: [code="java"] /** * 创建桌面快捷方式 */ private ...
  • Android创建快捷方式图标

    千次阅读 2015-03-03 10:53:26
    // 不重复创建快捷方式图标。 addIntent.putExtra("duplicate", false); // R.drawable.app_logo 快捷方式的图标icon。 addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent....
  • Android基础之创建快捷方式

    千次阅读 2017-08-14 23:28:07
    -- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <!-- 移除快捷方式 --> <uses-permission android:name="com.android.launcher.permission.UNINST
  • 安卓8.0以前,如果需要给安卓APP创建快捷方式,需要使用到广播机制。 而在最新的安卓8.0中,旧的广播创建快捷方式方式是已经过时甚至失效了的。 而新的快捷方式使用了一个新的类:ShortcutManager,谷歌在抛弃旧...
  • 如何判断快捷方式是否...一般android应用程序安装完成后是不会自动创建快捷方式的,所以可以自己在程序启动时实现。 需要权限  和要点击快捷方式对应的那个activity的属性。  以下是代码片段:  
  • 各位好,我在做一款创建app快捷方式的应用,但创建快捷方式有原app的logo角标,请问这个角标的获取路径是哪里,怎么隐藏或去掉</p>
  • 1. 在清单文件里面进行注册:例如: android:name="com.android.master.legend.widget.CreateSystemSettingsWidgetActivity" android:exported="true" android:icon="@drawable/
  • 1.在androidManifest文件中,想要创建快捷方式的Activity中加入android.intent.action.MAIN的action。缺少这行代码,点击快捷方式时,会提示没有安装这个应用。 Activity里面还要添加上android:launchMode=...
  • Android 8.0 创建桌面快捷方式

    千次阅读 2018-08-28 15:36:29
    1. 前言:公司有个给app创建桌面快捷方式的功能。 有一天,测试来说,有款手机,点击快捷方式,无反应。    2.思考:大多数手机是好的,考虑是兼容性问题。 1)经查看,问题机是 华为mate9 8.0系统.(有快捷...
  • 安卓创建快捷方式

    2020-03-13 17:21:02
    用requestPinShortcut方法,不同机型不可一概而论,所以还是算了吧
  • 有些应用是在安装按成后就直接在用户桌面强制创建快捷方式,有些是当用户第一次使用时提示用户是否创建快捷方式。 以下步骤简要说明如何在桌面创建快捷方式: (1):创建一个添加快捷方式的Intent,该Intent的...
  • 有段时间没有记录过了。...现在sdk应设计的要求要在使用了我们sdk的游戏在安装打开以后就要创建一个快捷方式,然后这个快捷方式不是用来打开应用,是为了进行静默下载所创建的,但是我们知道android

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,808
精华内容 4,723
关键字:

安卓手机创建快捷方式