android 桌面快捷方式

来源:互联网 发布:为什么软件会闪退 编辑:程序博客网 时间:2024/06/08 07:40

移驾github


    • 通过Uri方式启动Activity
    • 创建桌面图标跳转至指定Uri
    • 创建桌面图标跳转至指定Activity
    • 创建桌面图标跳转至指定Activity 别名方式
    • 创建桌面图标跳转至指定Activity Scheme方式


通过Uri方式启动Activity

/**    * 通过设置Uri启动另一个网址或者页面,此为调用系统浏览器打开百度地址,项目中可以在webview打开    */   public void startActivityByUri() {       //注意此处 http,在项目中也可以通过更改Scheme进行跳转网址       Uri uri = Uri.parse("http://www.baidu.com");        //不可以使用Intent.ACTION_MAIN,No Activity found to handle Intent       Intent intent = new Intent(Intent.ACTION_VIEW, uri);       startActivity(intent);   }

创建桌面图标跳转至指定Uri

  /**   * 创建桌面快捷图标跳转至指定的Uri,使用此方式删除应用之后,创建的快捷图标不会删除,   * 如果采用跳转到本App的Activity的方式生成桌面快捷图标会删除   * 启动之后为打开另一个App,点击返回之后会生成一次按照该App的回退方式返回   */  public void createShortcutToUri() {      /**       * pending:悬而未决,即将发生。 就是创建的快捷方式点击之后跳转的Intent       * 同样不可以使用Intent.ACTION_MAIN,点击图标之后显示未安装该应用       */      Uri uri = Uri.parse("http://www.baidu.com");      Intent pendingIntent = new Intent(Intent.ACTION_VIEW, uri);//pendingIntent.addCategory(Intent.CATEGORY_LAUNCHER);  //不可以添加该参数字段,一切与本App相关的设置都取消      //创建图标的过程 --start      Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");      //桌面快捷方式标题,最终图标的信息会存到数据库,相当于title的字段      shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我是图标名称");      //桌面快捷方式图标,可动态生成多个不同图标的快捷方式      shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, R.mipmap.ic_launcher);      //桌面快捷方式的动作,点击图标后执行的动作,即设置好的pendingIntent      shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, pendingIntent);      //--end      sendBroadcast(shortcutIntent);//发送创建图标的广播  }

创建桌面图标跳转至指定Activity

     /**     * people 创建桌面图标跳转至本App的指定Activity,随本App卸载一起消失     */    public void createShortcutToActivity(String name, int shortcutIcon) {        //此方式ACTION_MAIN,ACTION_VIEW均可创建并跳转成功        Intent pendingIntent = new Intent(Intent.ACTION_VIEW);        //pendingIntent.addCategory(Intent.CATEGORY_LAUNCHER); //测试验证可以不需要        //TODO 待考证必须有以上两行,否则跳转Activity的时候getIntent获取不到,或者只是获取之前的设置好的值,        pendingIntent.setClass(this, PendingActivity.class);//跳转至本App的PendingActivity_1页面        pendingIntent.putExtra("携带参数", "我是携带的参数: " + name);        //创建图标的过程 --start        Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);        Parcelable icon = Intent.ShortcutIconResource.fromContext(getApplicationContext(), shortcutIcon);        //设置图标同样可以用Intent.EXTRA_SHORTCUT_ICON_RESOURCE        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);        //不写此字段,默认是不可以重复的,但安卓机型原生系统修改可能不支持该字段,可以进行数据库查询判断        shortcutIntent.putExtra("duplicate", false);        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, pendingIntent);        //--end        sendBroadcast(shortcutIntent);    }

创建桌面图标跳转至指定Activity 别名方式

    /**     * 生成多个桌面图标的话,在一般手机上只要更换图标的名称就是可以的,但是最近遇到一个相当棘手的bug  如下:     * <p>     * 需要创建多个桌面快捷方式,但是在中兴ZTE A2015 6.0.1等部分机型上若生成快捷方式指定跳转至一个Activity的情况下(比如更换名称但都是跳转到PendingActivity_1这个界面),     * ,首次可以生成多个桌面图标,但是点击Home键或者返回至桌面后,只能传递数据覆盖,无法生成多个快捷方式,     * 但是也不能在清单文件注册无限个Activity,使用代理Activity的话,也相当于替换Activity,(代理解释参考:https://zhuanlan.zhihu.com/p/21348609)     * 同样需要手动创建多个Activity,但是不满足需求,现在的问题是 生成桌面快捷方式需要不同的Activity才能创建多个,否则只能创建一个,可能会创建N多个     * <p>     * 初期想到的解决办法是,使用别名的方法。在清单文件显示写入多个别名,不可能写N多个,虽有限制,但可以解决仅仅能生成一个问题,但使用该方法对于正常机型确是一种累赘     * 实现方式如下,仅供学习,但不采用     *     * @param name     * @param i     */    public void createShortcutToActivityAlisa(String name, int i) {        Intent pendingIntent = new Intent();        pendingIntent.setAction(Intent.ACTION_VIEW);        pendingIntent.setClass(this, PendingActivity.class);        /**         * 注意!!!别名的name需要加上包名,否则图标不会找到,显示未安装该应用的提示         *         *  使用别名的方式在清单文件中注册俩个(Activity别名参考:http://www.open-open.com/lib/view/open1483148577810.html)         *  com.simple.mydemo.PendingActivity_1_Alias_1         *  com.simple.mydemo.PendingActivity_1_Alias_2         *  测试方法略显粗暴!!所以就写了俩个动态传进来末尾不同的数字         *  在实际项目总若是保存在缓存中,进行清理的时候数据可能会失效,所以需要慎重处理         *         */        pendingIntent.setComponent(new ComponentName(this.getPackageName(), "com.simple.mydemo.PendingActivity_Alias_" + i));        Bundle bundle = new Bundle();        bundle.putString("携带参数", "我是携带的参数: " + name);        pendingIntent.putExtras(bundle);        /**         * 网上搜到有这条属性,有需求可添加         * 设置这条属性,可以使点击快捷方式后关闭其他的任务栈的其他activity,然后创建指定的acticity         * (参考:http://blog.csdn.net/bjp000111/article/details/51363981)         *///        pendingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我是图标名称");        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, R.mipmap.ic_launcher);        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, pendingIntent);        sendBroadcast(shortcutIntent);        /**         * 安卓各大厂商修改ROM,可能导致有的字段不支持,详情移架医生早年写的博客,进行数据库之类的分析,下面是摘自其中utils类进行查看         * http://www.jianshu.com/p/dc3d04337d00?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq         */        ShortcutSuperUtils.isShortCutExist(this, name, shortcutIntent);    }

创建桌面图标跳转至指定Activity Scheme方式

/**     * 精品来了,App内部通过Scheme的方式进行创建图标,缺点:每次的图标启动的页面参数写死,实际项目中,若后台参数改变则地址可能找不到     * 但可以满足需求,也可以解决,比如携带参数进来之后,然后进入页面的时候可以更改参数重新刷一次页面     * <p>     * (精品地址:http://blog.csdn.net/wanggsx918/article/details/40541993)     *     * @param name     */    public void createShortcutToScheme(String name) {        /**         * 仅此而已,不可进行其他的与本App相关的设置,然后在AndroidManifest文件进行配置         * 对Activity添加意图过滤器,可以添加多个intent—filter进行筛选         *         */        Intent pendingIntent = new Intent();        pendingIntent.setAction(Intent.ACTION_VIEW);//切记不可用Intent.ACTION_MAIN        pendingIntent.setData(Uri.parse("http://www.baidu.com"));//实际项目总将http换位和后台协调好的Scheme,注意清单文件更改,在这里我使用是http所以跳转的是浏览器        //不要纠结,以上三行等价于这个 Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("IamScheme://www.baidu.com"));        pendingIntent.putExtra("携带参数", "我是携带的参数: " + name);//可以携带,若有别的需求不满足可在携带的参数中做文章,也可在Scheme做文章        /**         * 创建桌面快捷方式的图标比较单一,目前网址的资料大多数12,13年的,Android7.0以后会提供ShortcutInfo的Api,效果也比较cool         * 之前遇到的问题,应该在6.0的部分机型会出现,但是Scheme的方法完美的解决问题         */        Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我是图标名称");        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, R.mipmap.ic_launcher);        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, pendingIntent);        sendBroadcast(shortcutIntent);    }

清单文件参考:http://www.jianshu.com/p/f77b5e1d76c9

0 0