精华内容
下载资源
问答
  • 仿照微信或是淘宝网,发送快捷方式到桌面,主要代码如下: // 安装的Intent Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); // 快捷名称 shortcut.putExtra(Intent.EXTRA...
  • The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut! Supported launchers: Sony Samsung LG HTC ...
  • /*** 为程序创建桌面快捷方式*/private void addShortcut(){Intent shortcut = new Intent(“com.android.launcher.action.INSTALL_SHORTCUT”);//快捷方式的名称shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, ...

    /**

    * 为程序创建桌面快捷方式

    */

    private void addShortcut(){

    Intent shortcut = new Intent(“com.android.launcher.action.INSTALL_SHORTCUT”);

    //快捷方式的名称

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));

    shortcut.putExtra(“duplicate”, false); //不允许重复创建

    //指定当前的Activity为快捷方式启动的对象: 如 //com.everest.video.VideoPlayer

    //注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序

    ComponentName comp = new ComponentName(this.getPackageName(), “.”+this.getLocalClassName());

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));

    //快捷方式的图标

    ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);

    sendBroadcast(shortcut);

    }

    /**

    * 删除程序的快捷方式

    */

    private void delShortcut(){

    Intent shortcut = new Intent(“com.android.launcher.action.UNINSTALL_SHORTCUT”);

    //快捷方式的名称

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));

    //指定当前的Activity为快捷方式启动的对象: 如 //com.everest.video.VideoPlayer

    //注意: ComponentName的第二个参数必须是完整的类名(包名+类名),否则无法删除快捷方式

    String appClass = this.getPackageName() + “.” +this.getLocalClassName();

    ComponentName comp = new ComponentName(this.getPackageName(), appClass);

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));

    sendBroadcast(shortcut);

    }

    展开全文
  • /**** 返回添加到桌面快捷方式的Intent:** 1.给Intent指定action="com.android.launcher.INSTALL_SHORTCUT"** 2.给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)** 3.添加权限:...

    /**

    *

    * 返回添加到桌面快捷方式的Intent:

    *

    * 1.给Intent指定action="com.android.launcher.INSTALL_SHORTCUT"

    *

    * 2.给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)

    *

    * 3.添加权限:com.android.launcher.permission.INSTALL_SHORTCUT

    */

    public Intent getShortcutToDesktopIntent(Context context) {

    Intent intent = new Intent();

    intent.setClass(context, context.getClass());

    /* 以下两句是为了在卸载应用的时候同时删除桌面快捷方式 */

    intent.setAction("android.intent.action.MAIN");

    intent.addCategory("android.intent.category.LAUNCHER");

    Intent shortcut = new Intent(

    "com.android.launcher.action.INSTALL_SHORTCUT");

    // 不允许重建

    shortcut.putExtra("duplicate", false);

    // 设置名字

    // shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,context.getString(R.string.app_name));

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "11111");

    // 设置图标

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,

    Intent.ShortcutIconResource.fromContext(context,

    R.drawable.youtube));

    // 设置意图和快捷方式关联程序

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);

    return shortcut;

    }

    权限

    调用

    public void click1(View v) {

    Intent intent = this.getShortcutToDesktopIntent(MainActivity.this);

    sendBroadcast(intent);

    }

    展开全文
  • 在某些情况下需要对应用创建桌面快捷方式,特别是在使用原生系统(4.3到8.0)运行物联网app时,往往存在二级菜单,而应用图标默认安装在二级菜单(现在国内主流手机厂商的系统都没有二级菜单了),如果按照网上的...

    前言

            在某些情况下需要对应用创建桌面快捷方式,特别是在使用原生系统(4.3到8.0)运行物联网app时,往往存在二级菜单,而应用图标默认安装在二级菜单(现在国内主流手机厂商的系统都没有二级菜单了),如果按照网上的做法是可以创建和兼容8.0系统,但存在一个问题:

             点击快捷方式打开应用和点击二级菜单应用图标打开应用,会出现重启应用的问题,导致两边进入应用显示的页面内容不一致,体验极不友好,比如:通过快捷方式进入应用并经过一系列操作进入到看某网红直播的页面,然后按home键,进入系统二级菜单点击了应用图标,这时发现应用重启,真操蛋。 

    解决方法

    为 快捷方式意图设置如下代码即可:

            shortcutInfoIntent.setClassName(activity, activity.getClass().getName());
            shortcutInfoIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            shortcutInfoIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
            shortcutInfoIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    这样不管那边启动应用,两边界面内容一致

    操作步骤

    1.添加权限 

     <!--快捷方式-->
        <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
        <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
        <uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
        <uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
        <!-- 查询快捷方式2.1以下 -->
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
        <!-- 查询快捷方式4.4及以下 -->
        <uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
        <!-- 查询快捷方式4.4以上 -->
        <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
        <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />

     2.使用工具类在启动页操作

    该工具类已经适配4.3到8.0快捷方式创建

    package com.sjl.core.util;
    
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ShortcutInfo;
    import android.content.pm.ShortcutManager;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.Icon;
    import android.net.Uri;
    import android.os.Build;
    import android.text.TextUtils;
    import android.util.Log;
    
    /**
     * 快捷方式创建工具类
     *
     * @author Kelly
     * @version 1.0.0
     * @filename ShortcutUtils.java
     * @time 2019/5/28 17:35
     * @copyright(C) 2019 song
     */
    public class ShortcutUtils {
        private static final String TAG = "ShortcutUtils";
    
        /**
         * 添加桌面图标快捷方式
         *
         * @param activity Activity对象,设置要启动的activity,一般都是应用入口类
         * @param nameId   快捷方式名称id
         * @param iconId   图标资源id
         */
        public static void addShortcut(Activity activity, int nameId, int iconId) {
            Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), iconId, null);
            addShortcut(activity, activity.getResources().getString(nameId), bitmap);
        }
    
    
        /**
         * 添加桌面图标快捷方式
         *
         * @param activity Activity对象
         * @param name     快捷方式名称
         * @param icon     快捷方式图标
         */
        public static void addShortcut(Activity activity, String name, Bitmap icon) {
            Intent shortcutInfoIntent = new Intent(Intent.ACTION_MAIN);
            /**
             * 点击快捷方式回到应用,而不是重新启动应用,解决系统一级菜单和二级菜单进入应用不一致问题
             */
            shortcutInfoIntent.setClassName(activity, activity.getClass().getName());
            shortcutInfoIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            shortcutInfoIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
            shortcutInfoIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                if (isShortCutExist(activity, name)) {
                    Log.w(TAG, "shortcut already exist.");
                    return;
                }
                //  创建快捷方式的intent广播
                Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
                // 添加快捷名称
                shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
                //  快捷图标是允许重复(不一定有效)
                shortcut.putExtra("duplicate", false);
                // 快捷图标
                // 使用资源id方式
    //            Intent.ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(activity, R.mipmap.icon);
    //            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
                // 使用Bitmap对象模式
                shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);
                // 添加携带的下次启动要用的Intent信息
                shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutInfoIntent);
                // 发送广播
                activity.sendBroadcast(shortcut);
            } else {
                ShortcutManager shortcutManager = (ShortcutManager) activity.getSystemService(Context.SHORTCUT_SERVICE);
                if (null == shortcutManager) {
                    // 创建快捷方式失败
                    Log.e(TAG, "Create shortcut failed.ShortcutManager is null.");
                    return;
                }
                shortcutInfoIntent.setAction(Intent.ACTION_VIEW); //action必须设置,不然报错
                ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(activity, name)
                        .setShortLabel(name)
                        .setIcon(Icon.createWithBitmap(icon))
                        .setIntent(shortcutInfoIntent)
                        .setLongLabel(name)
                        .build();
                shortcutManager.requestPinShortcut(shortcutInfo, PendingIntent.getActivity(activity,
                        0, shortcutInfoIntent, PendingIntent.FLAG_UPDATE_CURRENT).getIntentSender());
            }
        }
    
    
        /**
         * 判断快捷方式是否存在
         *
         * @param context 上下文
         * @param title   快捷方式标志,不能和其它应用相同
         * @return
         */
        public static boolean isShortCutExist(Context context, String title) {
    
            boolean isInstallShortcut = false;
    
            if (null == context || TextUtils.isEmpty(title))
                return isInstallShortcut;
            String authority = getAuthority();
            final ContentResolver cr = context.getContentResolver();
            if (!TextUtils.isEmpty(authority)) {
                try {
                    final Uri CONTENT_URI = Uri.parse(authority);
    
                  //  Cursor c = cr.query(CONTENT_URI, new String[]{"title", "iconResource"}, "title=?", new String[]{title.trim()},
                            null);
    
                    Cursor c = cr.query(CONTENT_URI, new String[]{"title"}, "title=?", new String[]{title.trim()},
                            null);
    
                    // XXX表示应用名称。
                    if (c != null && c.getCount() > 0) {
                        isInstallShortcut = true;
                    }
                    if (null != c && !c.isClosed())
                        c.close();
                } catch (Exception e) {
                    Log.e(TAG, "isShortCutExist:" + e.getMessage());
                }
            }
            return isInstallShortcut;
        }
    
        public static String getAuthority() {
            String authority;
            int sdkInt = android.os.Build.VERSION.SDK_INT;
            if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的
                authority = "com.android.launcher.settings";
            } else if (sdkInt <= 19) {// Android 4.4及以下
                authority = "com.android.launcher2.settings";
            } else {// 4.4以上
                authority = "com.android.launcher3.settings";
            }
            return "content://" + authority + "/favorites?notify=true";
        }
    
    }
    

    3.代码调用

            ShortcutUtils.addShortcut(SplashActivity.this, R.string.app_name, R.mipmap.ic_launcher);
    

     

     

    展开全文
  • Android快捷方式解密

    2019-02-14 18:39:59
    Android快捷方式解密
                           

    Android快捷方式解密

    Android快捷方式作为Android设备的杀手锏技能,一直都是非常重要的一个功能,也正是如此,各种流氓App也不断通过快捷方式霸占着这样一个用户入口。

    同时,各大国产ROM和Luncher的崛起,让这个桌面之争变的更加激烈。毕竟大家都只想用户用自己的App资源,所以,现在各大App不仅仅是要抢占入口,同时还要和各大ROM斗智斗勇。本文将对这个快捷方式进行深度解密,同时给出App适配各种ROM的整合方案。

    本文很多地方参考了这位朋友的实现:

    https://gist.github.com/waylife/437a3d98a84f245b9582

    特此表示感谢!

    创建快捷方式之——少林派

     

    所谓少林,是指系统正统的解决方法

    天下武功出少林,天下的快捷方式都是Google给的,我们先来看看如何使用Android系统提供的方式来使用Android的快捷方式。

     

    首先大家要知道各种Launcher的区别,原生的Launcher,是两层结构,桌面是快捷方式,而进去后的App列表是App的Launch Icon;而以小米为首的一帮ROM,参考iOS风格,将Launcher改为了一层,即直接显示Launch Icon。

    权限设置

        <!-- 添加快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />    <!-- 移除快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />    <!-- 查询快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建快捷方式

    创建快捷方式的Action:

        // Action 添加Shortcut    public static final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
      
    • 1
    • 2

    通过广播创建快捷方式:

        /**     * 添加快捷方式     *     * @param context      context     * @param actionIntent 要启动的Intent     * @param name         name     */    public static void addShortcut(Context context, Intent actionIntent, String name,                                   boolean allowRepeat, Bitmap iconBitmap) {        Intent addShortcutIntent = new Intent(ACTION_ADD_SHORTCUT);        // 是否允许重复创建        addShortcutIntent.putExtra("duplicate", allowRepeat);        // 快捷方式的标题        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);        // 快捷方式的图标        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, iconBitmap);        // 快捷方式的动作        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, actionIntent);        context.sendBroadcast(addShortcutIntent);    }
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    参数相信大家都能看得懂,只是有一点需要注意的,duplicate这个属性,是设置该快捷方式是否允许多次创建的属性,但是,在很多ROM上都不能成功识别,嗯,这就是我们最开始说的快捷方式乱现象。

    删除快捷方式

    删除快捷方式的Action:

        // Action 移除Shortcut    public static final String ACTION_REMOVE_SHORTCUT = "com.android.launcher.action.UNINSTALL_SHORTCUT";
      
    • 1
    • 2

    通过广播删除快捷方式:

        /**     * 移除快捷方式     *     * @param context      context     * @param actionIntent 要启动的Intent     * @param name         name     */    public static void removeShortcut(Context context, Intent actionIntent, String name) {        Intent intent = new Intent(ACTION_REMOVE_SHORTCUT);        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);//        intent.addCategory(Intent.CATEGORY_LAUNCHER);        intent.putExtra("duplicate", false);        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, actionIntent);        context.sendBroadcast(intent);    }
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参数与创建快捷方式的方法击败类似,需要注意的是,Intent.EXTRA_SHORTCUT_INTENT,与之前创建快捷方式的Intent必须要是同一个,不然是无法删除快捷方式的。

    创建快捷方式之——逍遥派

     

    所谓逍遥派,是指我们从原理来理解如何来适配各种Launcher。

    原生的快捷方式添加方法,虽然是官方提供的,但在天国这样一个怎么说呢的国家里,基本是很难使用、适配的,也就是我们最开始说的那些原因。下面我们先从快捷方式的整个生命周期来了解下产生、添加、删除快捷方式的原理,再来思考如何实现多ROM、Launcher的适配。

    快捷方式的存储

    快捷方式其实都存储在Launcher的数据库中,我们在手机上打开SQLite Editor打开Launcher的数据库。

    1.png

    我们打开Launcher.db的favorite表,这里就是我们保存的快捷方式数据:

    2.png

    几个主要的字段大家基本一看就懂:title、intent、iconResource、icon,分别对应快捷方式名称,快捷方式intent,快捷方式图标来源,快捷方式图标二进制数据。

    快捷方式的创建

    了解了快捷方式的存储原理,我们就可以针对这个数据库来做文章,所有的快捷方式都可以通过修改这个数据库来实现,同时还不用太考虑兼容性问题。

    对于快捷方式的创建,我们依然可以使用系统提供的方法,所以这里不再多说。

    快捷方式的判断是否存在

    前面我们说了,通过duplicate属性可以区分是否允许创建重复的快捷方式,但是,很多ROM是无法兼容到的,所以,这里我们使用查询Launcher数据库的方式来实现。

    我们先来看代码:

        /**     * 检查快捷方式是否存在 <br/>     * <font color=red>注意:</font> 有些手机无法判断是否已经创建过快捷方式<br/>     * 因此,在创建快捷方式时,请添加<br/>     * shortcutIntent.putExtra("duplicate", false);// 不允许重复创建<br/>     * 最好使用{@link #isShortCutExist(Context, String, Intent)}     * 进行判断,因为可能有些应用生成的快捷方式名称是一样的的<br/>     */    public static boolean isShortCutExist(Context context, String title) {        boolean result = false;        try {            ContentResolver cr = context.getContentResolver();            Uri uri = getUriFromLauncher(context);            Cursor c = cr.query(uri, new String[]{"title"}, "title=? ", new String[]{title}, null);            if (c != null && c.getCount() > 0) {                result = true;            }            if (c != null && !c.isClosed()) {                c.close();            }        } catch (Exception e) {            result = false;            e.printStackTrace();        }        return result;    }    /**     * 不一定所有的手机都有效,因为国内大部分手机的桌面不是系统原生的<br/>     * 更多请参考{@link #isShortCutExist(Context, String)}<br/>     * 桌面有两种,系统桌面(ROM自带)与第三方桌面,一般只考虑系统自带<br/>     * 第三方桌面如果没有实现系统响应的方法是无法判断的,比如GO桌面<br/>     */    public static boolean isShortCutExist(Context context, String title, Intent intent) {        boolean result = false;        try {            ContentResolver cr = context.getContentResolver();            Uri uri = getUriFromLauncher(context);            Cursor c = cr.query(uri, new String[]{"title", "intent"}, "title=?  and intent=?",                    new String[]{title, intent.toUri(0)}, null);            if (c != null && c.getCount() > 0) {                result = true;            }            if (c != null && !c.isClosed()) {                c.close();            }        } catch (Exception ex) {            result = false;            ex.printStackTrace();        }        return result;    }    private static Uri getUriFromLauncher(Context context) {        StringBuilder uriStr = new StringBuilder();        String authority = LauncherUtil.getAuthorityFromPermissionDefault(context);        if (authority == null || authority.trim().equals("")) {            authority = LauncherUtil.getAuthorityFromPermission(context, LauncherUtil.getCurrentLauncherPackageName(context) + ".permission.READ_SETTINGS");        }        uriStr.append("content://");        if (TextUtils.isEmpty(authority)) {            int sdkInt = android.os.Build.VERSION.SDK_INT;            if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的                uriStr.append("com.android.launcher.settings");            } else if (sdkInt < 19) {// Android 4.4以下                uriStr.append("com.android.launcher2.settings");            } else {// 4.4以及以上                uriStr.append("com.android.launcher3.settings");            }        } else {            uriStr.append(authority);        }        uriStr.append("/favorites?notify=true");        return Uri.parse(uriStr.toString());    }
      
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    这里有两个重载的isShortCutExist方法,唯一的区别就是最后一个参数——intent,加这个参数的原因,在注释中已经写了,更加精确。而getUriFromLauncher方法,是给调用的ContentResolver提供Uri。构造的时候,可以看见,Android的版本话碎片问题,是多么的严重……

    这样在添加快捷方式前,通过这个判断下,就可以只添加一个快捷方式了。

    为任意PackageName的App添加快捷方式

    知道了我们是如何判断快捷方式是是否存在的,我们就可以通过这种思路来为任意PackageName的App添加快捷方式,代码如下:

        /**     * 为PackageName的App添加快捷方式     *     * @param context context     * @param pkg     待添加快捷方式的应用包名     * @return 返回true为正常执行完毕     */    public static boolean addShortcutByPackageName(Context context, String pkg) {        // 快捷方式名        String title = "unknown";        // MainActivity完整名        String mainAct = null;        // 应用图标标识        int iconIdentifier = 0;        // 根据包名寻找MainActivity        PackageManager pkgMag = context.getPackageManager();        Intent queryIntent = new Intent(Intent.ACTION_MAIN, null);        queryIntent.addCategory(Intent.CATEGORY_LAUNCHER);// 重要,添加后可以进入直接已经打开的页面        queryIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);        queryIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);        List<ResolveInfo> list = pkgMag.queryIntentActivities(queryIntent,                PackageManager.GET_ACTIVITIES);        for (int i = 0; i < list.size(); i++) {            ResolveInfo info = list.get(i);            if (info.activityInfo.packageName.equals(pkg)) {                title = info.loadLabel(pkgMag).toString();                mainAct = info.activityInfo.name;                iconIdentifier = info.activityInfo.applicationInfo.icon;                break;            }        }        if (mainAct == null) {            // 没有启动类            return false;        }        Intent shortcut = new Intent(                "com.android.launcher.action.INSTALL_SHORTCUT");        // 快捷方式的名称        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);        // 不允许重复创建        shortcut.putExtra("duplicate", false);        ComponentName comp = new ComponentName(pkg, mainAct);        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,                queryIntent.setComponent(comp));        // 快捷方式的图标        Context pkgContext = null;        if (context.getPackageName().equals(pkg)) {            pkgContext = context;        } else {            // 创建第三方应用的上下文环境,为的是能够根据该应用的图标标识符寻找到图标文件。            try {                pkgContext = context.createPackageContext(pkg,                        Context.CONTEXT_IGNORE_SECURITY                                | Context.CONTEXT_INCLUDE_CODE);            } catch (PackageManager.NameNotFoundException e) {                e.printStackTrace();            }        }        if (pkgContext != null) {            Intent.ShortcutIconResource iconRes = Intent.ShortcutIconResource                    .fromContext(pkgContext, iconIdentifier);            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);        }        // 发送广播,让接收者创建快捷方式        // 需权限<uses-permission        // android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />        context.sendBroadcast(shortcut);        return true;    }
      
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    创建快捷方式之——星宿派

     

    所谓星宿派,是指我们使用一些Trick来解决多Launcher适配的问题。

    由于快捷方式的碎片化非常严重,所以,你顾得上这种ROM,顾不上其它ROM。例如,在原生ROM上,你需要使用类似原生的Launcher权限:

        <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
      
    • 1
    • 2

    但是,在其它ROM上呢,例如华为,你需要这样的权限:

        <uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" />    <uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" />
      
    • 1
    • 2

    为了程序能够通用性够强,理论上我们得为所有不使用原生Launcher权限的Launcher配置权限代码,是的,你妹听错,是所有,只有通过这种奇技淫巧,才能适配更多的Launcher,这里贴一部分给大家爽一下:

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />    <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.miui.mihome2.permission.READ_SETTINGS" />    <uses-permission android:name="com.miui.mihome2.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" />
      
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    这时候大家肯定要问了,你申请这么多权限,用户在安装App的时候,不是要崩溃了,尼玛,这么多看都看不过来啊,其实,根本不需要担心,因为这些基本都是各自ROM中的第三方ROM权限,在用户安装的时候,他们通常会被解析成原生Launcher的权限,例如:添加、修改桌面快捷方式。并不会将所有的权限都写出来。

    创建快捷方式之——西域派

     

    所谓西域派,是因为我想不出其他名字了。西域一派,使用其他方式来实现类似快捷方式的方法。

    快捷方式的确是我们为应用导流的一个非常重要的入口,但是,由于碎片化实在太严重,所以,我们可以使用在Launcher App列表中为应用增加一个入口的方式来为App导流,简单的说,就是增进一个App的入口Activity。

    <activity android:name=".MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity><activity    android:name="com.hujiang.hj_shortcut_lib.HJShortcutActivity"    android:theme="@style/Base.Theme.AppCompat.Dialog">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    非常简单,相信大家都知道这种方式来给App增加一个Activity入口。但是,这种方式,我们如何能够自由的控制这个入口是否显示呢?

    奇技PackageManager

    PackageManager提供了一系列Package的管理方法,当然,也包含了我们非常关心的启用、停用组件这一方法,这个方法在Root情况下,可以修改任一App的任意组件,在普通情况下,对自身App有绝对权限。使用方法也非常简单:

        public static void toggleFlowEntrance(Context context, Class launcherClass) {        PackageManager packageManager = context.getPackageManager();        ComponentName componentName = new ComponentName(context, launcherClass);        int res = packageManager.getComponentEnabledSetting(componentName);        if (res == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT ||                res == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {            // 隐藏应用图标            packageManager.setComponentEnabledSetting(                    componentName,                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,                    PackageManager.DONT_KILL_APP);        } else {            // 显示应用图标            packageManager.setComponentEnabledSetting(                    componentName,                    PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,                    PackageManager.DONT_KILL_APP);        }    }
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    一统江湖

    前面我们分析了各种快捷方式、Launcher入口的方式来对App进行导流,当然,这不是我们的目的,我们的目的是能够掌握Android快捷方式的哭花宝典而不用那个啥。

    所以,下面我封装了一个shortcut的开源库,从而可以尽可能的忽略ROM的差异,来使用快捷方式和Launcher入口。

    项目地址:

    https://github.com/xuyisheng/ShortcutHelper

    目前该项目还在测试阶段,还要很多问题和适配bug需要解决,欢迎大家提issue。

    README如下:

    ShortcutLib使用指南

    本项目目前还在测试阶段,请大家多提issue,共同完善。

    项目意义

    快速使用shortcut,避免各种ROM适配导致的各种问题。

    项目可用功能API

    • 增加快捷方式
        /**     * 添加快捷方式     *     * @param context      context     * @param actionIntent 要启动的Intent     * @param name         name     * @param allowRepeat  是否允许重复     * @param iconBitmap   快捷方式图标     */    public static void addShortcut(Context context, Intent actionIntent, String name,                                   boolean allowRepeat, Bitmap iconBitmap)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 判断快捷方式是否存在

    基础方式

        /**     * 判断快捷方式是否存在     * <p/>     * 检查快捷方式是否存在 <br/>     * <font color=red>注意:</font> 有些手机无法判断是否已经创建过快捷方式<br/>     * 因此,在创建快捷方式时,请添加<br/>     * shortcutIntent.putExtra("duplicate", false);// 不允许重复创建<br/>     * 最好使用{@link #isShortCutExist(Context, String, Intent)}     * 进行判断,因为可能有些应用生成的快捷方式名称是一样的的<br/>     *     * @param context context     * @param title   快捷方式名     * @return 是否存在     */    public static boolean isShortCutExist(Context context, String title)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    严格方式(增加Intent的检查)

        /**     * 判断快捷方式是否存在     * <p/>     * 不一定所有的手机都有效,因为国内大部分手机的桌面不是系统原生的<br/>     * 更多请参考{@link #isShortCutExist(Context, String)}<br/>     * 桌面有两种,系统桌面(ROM自带)与第三方桌面,一般只考虑系统自带<br/>     * 第三方桌面如果没有实现系统响应的方法是无法判断的,比如GO桌面<br/>     *     * @param context context     * @param title   快捷方式名     * @param intent  快捷方式Intent     * @return 是否存在     */    public static boolean isShortCutExist(Context context, String title, Intent intent)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    更新快捷方式

        /**     * 更新桌面快捷方式图标,不一定所有图标都有效(有可能需要系统权限)     *     * @param context context     * @param title   快捷方式名     * @param intent  快捷方式Intent     * @param bitmap  快捷方式Icon     */    public static void updateShortcutIcon(Context context, String title, Intent intent, Bitmap bitmap)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
     

    需要注意的是,更新快捷方式在很多手机上都不能生效,需要系统权限。可以通过先删除、再新增的方式来实现。

    为任意PackageName的App添加快捷方式

        /**     * 为任意PackageName的App添加快捷方式     *     * @param context context     * @param pkg     待添加快捷方式的应用包名     * @return 返回true为正常执行完毕     */    public static boolean addShortcutByPackageName(Context context, String pkg)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    移除快捷方式

        /**     * 移除快捷方式     *     * @param context      context     * @param actionIntent 要启动的Intent     * @param name         name     */    public static void removeShortcut(Context context, Intent actionIntent, String name)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    显示隐藏Launcher入口

        /**     * 显示\隐藏Launcher入口     *     * @param context       context     * @param launcherClass launcherClass     */    public static void toggleFlowEntrance(Context context, Class launcherClass)
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用Launcher入口需要在AndroidMainifest文件中注册新增的入口Activity,例如:

    <activity android:name=".MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity><activity    android:name="com.xxx.xxxxx"    android:theme="@style/Base.Theme.AppCompat.Dialog">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用示例

        public void addShortcutTest(View view) {        // 系统方式创建        // ShortcutUtils.addShortcut(this, getShortCutIntent(), mShortcutName);        // 创建前判断是否存在        if (!ShortcutSuperUtils.isShortCutExist(this, mShortcutName, getShortCutIntent())) {            ShortcutUtils.addShortcut(this, getShortCutIntent(), mShortcutName, false,                    BitmapFactory.decodeResource(getResources(), com.hujiang.hj_shortcut_lib.R.drawable.ocsplayer));            finish();        } else {            Toast.makeText(this, "Shortcut is exist!", Toast.LENGTH_SHORT).show();        }        // 为某个包创建快捷方式        // ShortcutSuperUtils.addShortcutByPackageName(this, this.getPackageName());    }    public void removeShortcutTest(View view) {        ShortcutUtils.removeShortcut(this, getShortCutIntent(), mShortcutName);    }    public void updateShortcutTest(View view) {        ShortcutSuperUtils.updateShortcutIcon(this, mShortcutName, getShortCutIntent(),                BitmapFactory.decodeResource(getResources(), com.hujiang.hj_shortcut_lib.R.mipmap.ic_launcher));    }    public void toggleFlowEntrance(View view) {        FlowEntranceUtil.toggleFlowEntrance(this, HJShortcutActivity.class);    }    private Intent getShortCutIntent() {        // 使用MAIN,可以避免部分手机(比如华为、HTC部分机型)删除应用时无法删除快捷方式的问题        Intent intent = new Intent(Intent.ACTION_MAIN);        intent.addCategory(Intent.CATEGORY_DEFAULT);        intent.setClass(MainActivity.this, HJShortcutActivity.class);        return intent;    }
      
    • 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
    • 35
    • 36
    • 37
               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 简介帮助用户快速启动应用程序中的常见或推荐功能创建方式静态快捷方式:在打包到APK或应用包中的资源文件中定义。适合在用户与应用程序互动的整个生命周期内使用一致结构链接到内容的应用程序,即固定功能,固定...
  • Android 7.0后应用可以在启动图标上添加快捷方式,以便更快捷的操作。 这篇文章主要讲的就是相关的用法。 首先看下效果,再说用法。 如图,当长按启动logo时,除了卸载,信息,多除了一个快捷栏列表。 1:创建...
  • 今天遇到一个需求,就是向桌面添加一个快捷方式,使点击时链接到特定的网页。网上找了一下,看到这篇文章受其启发,实现了该功能。public voidaddShortcut(Parcelable icon, String name, Uri uri){Intent intent...
  • 在做创建应用快捷方式时遇到两个问题: 一、创建快捷方式OK,但测试时MOTO部分机型会报错,原因也在Log里面给提示,如下: [java] view plain copy print? java.lang.SecurityException: ...
  • Android Studio快捷方式

    2015-09-07 22:27:06
    Android Studio快捷方式详细介绍,掌握这些快捷方式可以提高开发效率
  • Android 应用快捷方式 Shortcuts 简介: 快捷方式可帮助用户快速访问您的应用的某些部分,从而为他们呈现特定类型的内容。一次最多可以为应用发布五个快捷方式(静态和动态快捷方式加在一起),但大多数启动器只能...
  • Android适配 - 桌面快捷方式

    千次阅读 2019-03-07 00:08:04
    谷歌官方在Android 7.1(25)新增了桌面长按弹出菜单,并且在8.0(26)以后可以固定快捷方式至桌面上。围绕桌面快捷方式的需求也比较多,例如微信将联系人、小程序都可以添加至桌面;简书将“写文章”添加至桌面;高德...
  • android 检查是否创建桌面快捷方式以及创建快捷方式
  • 3D Touch是一种立体触控技术,被苹果称为新一代多点触控技术,是在Apple Watch上采用的Force Touch,屏幕可感应不同的...随着IOS在iphone 6s 上加入了3d touch后,果粉手机很多应用都有了快捷访问的功能。比如下图:...
  • 为对应详情添加快捷桌面;已id作为唯一性 需要数据;详情id;图片封面;name;跳转url 实现逻辑(及差异性整理) 相关代码 import android.app.Activity; import android.app.PendingIntent; import android...
  • Android 8.0 创建桌面快捷方式

    千次阅读 2018-08-28 15:36:29
    1. 前言:公司有个给app创建桌面快捷方式的功能。 有一天,测试来说,有款手机,点击快捷方式,无反应。...2 ) 翻出华为mate10,下载app,发现问题,无法创建桌面快捷方式 3) 卸载mate9上的app,重新下载,...
  • 桌面快捷方式保存在当前Launcher App的数据库中,因实现而异。好像是一个xml指定的,然后代码里面读取设置,在res\xml的default_workspace.xml,launcher:packageName=...
  • /*** 是否已创建快捷方式* @return*/private boolean hasShortcut(){boolean isInstallShortcut = false;final String AUTHORITY ="com.android.launcher.settings";final Uri CONTENT_URI = Uri.parse("content://...
  • 参考:http://blog.csdn.net/pku_android/article/details/7438931直接上源码:package ...import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os...
  • 尽管静态快捷方式的上下文不会更改,而动态快捷方式的上下文会不断更改,但是两种情况下的上下文都是由您的应用程序驱动的。如果用户选择自己希望您的应用向其交付内容的方式(例如固定快捷方式),则上下文由用户...
  • 去除快捷方式角标.zip

    2019-11-06 20:58:59
    去除快捷方式角标 这是源代码 reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons” /v 29 /d “%systemroot%\system32\imageres.dll,197″ /t reg_sz /f taskkill /...
  • 安卓8.0以前,如果需要给安卓APP创建快捷方式,需要使用到广播机制。 而在最新的安卓8.0中,旧的广播创建快捷方式方式是已经过时甚至失效了的。 而新的快捷方式使用了一个新的类:ShortcutManager,谷歌在抛弃旧...
  • Android8.0快捷方式之Shortcuts

    千次阅读 2018-01-17 20:51:07
    如果你的应用程序的目标是Android 7.1(API级别25)或更高,你可以定义应用程序中特定动作的快捷方式,这些快捷方式可以显示在一个支持的启动器中。快捷方式让你的用户在你的应用程序中快速启动常见或推荐的任务。每个...
  • 有时候为了使用方便,需要在桌面上添加快捷方式,下面是两种添加快捷方式的方法:1.代码voidsetshortCut() {Intent addShortcut=newIntent();//设置快捷方式的名字addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,...
  • 这个效果是Android 7.1之后新增的一个功能:应用快捷方式ShortcutManager, 官方API地址: https://developer.android.google.cn/reference/android/content/pm/ShortcutManager.html
  • android 桌面快捷方式静态shortcuts异常

    千次阅读 2021-10-29 18:15:46
    1.给应用页面注册快捷方式(静态): 打开res/values目录下的string.xml,添加下述字符串: <string name="first_short">first</string> <string name="first_long">扫一扫</string> <...
  • App 快捷方式——创建快捷方式

    千次阅读 2019-01-15 18:53:07
    虽然静态快捷方式的上下文不会更改,并且动态快捷方式的上下文会不断更改,但两种情况下的上下文都是由您的应用程序驱动的。 如果用户选择他们希望您的应用向他们提供内容的方式,例如使用固定的快捷方式,则上下文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,309
精华内容 8,523
关键字:

安卓10快捷方式