总结:android 创建快捷方式的两种方式+判断是否已经创建+删除快捷方式

简介: 1. 在清单文件里面进行注册:例如:

1.   在清单文件里面进行注册:例如:

 <activity
            android:name="com.android.master.legend.widget.CreateSystemSettingsWidgetActivity"
            android:exported="true"
            android:icon="@drawable/ic_switcher_shortcut"
            android:label="@string/system_switcher_shortcut"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

这样,就会自动加入到 系统launcher的快捷方式里面 

2.  手动创建快捷方式

public static void createSystemSwitcherShortCut(Context context) {
    final Intent addIntent = new Intent(
        "com.android.launcher.action.INSTALL_SHORTCUT");
    final Parcelable icon = Intent.ShortcutIconResource.fromContext(
        context, R.drawable.ic_switcher_shortcut); // 获取快捷键的图标
    addIntent.putExtra("duplicate", false);
    final Intent myIntent = new Intent(context,
        SystemSwitcherActivity.class);
    myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
        context.getString(R.string.switch_widget));// 快捷方式的标题
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);// 快捷方式的图标
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myIntent);// 快捷方式的动作
    context.sendBroadcast(addIntent);
  }

更具有通用性的写法如下:

/** 
     * 为程序创建桌面快捷方式 
     */ 
    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); //不允许重复创建  
        /****************************此方法已失效*************************/
        //ComponentName comp = new ComponentName(this.getPackageName(), "."+this.getLocalClassName());  
        //shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));    
     /******************************end*******************************/
     Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
     shortcutIntent.setClassName(this, this.getClass().getName());
     shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        //快捷方式的图标  
        ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);  
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);  
        sendBroadcast(shortcut);  
    } 

小结:一般做法是在设置里面加上手动创建快捷方式的设置。

           在程序第一次启动的时候,手动创建一次快捷方式。

3.判断是否已经创建了快捷方式(在某些机型中需要判断)

private boolean hasShortcut()
{
        boolean isInstallShortcut = false;
        final ContentResolver cr = activity.getContentResolver();
        final String AUTHORITY ="com.android.launcher.settings";
        final Uri CONTENT_URI = Uri.parse("content://" +AUTHORITY + "/favorites?notify=true");
        Cursor c = cr.query(CONTENT_URI,new String[] {"title","iconResource" },"title=?",
        new String[] {mapViewActivity.getString(R.string.app_name).trim()}, null);
        if(c!=null && c.getCount()>0){
            isInstallShortcut = true ;
        }
        return isInstallShortcut ;

4.删除

/** 
     * 删除程序的快捷方式 
     */ 
    private void delShortcut(){  
        Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");  
        //快捷方式的名称  
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));  
        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);  
    }  

5.声明权限

在AndroidManifest.xml 文件中声明 创建和删除快捷方式时声明权限

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

6.一个应用开启多个的问题

现在都很流行在桌面上为自己的应用创建快捷方式,网上也很多例子,但是基本都是同一个,创建快捷方式的手法是对的,但是通过快捷方式开启自己的应用的时候会发现程序菜单里头打开的应用和桌面快捷方式打开的应用竟然不是同一个,这样会导致一个应用开启了多个。

 

一开始从activity的加载模式入手,把默认的activity的加载模式设置成了android:launchMode="singleInstance"   虽然每次都只开启了同一个页面,但是每次都是从新加载的,而不是直接调到已经开启的activity,这个交互很不理想;

 

经过仔细研究log发现,通过桌面快捷方式开启应用和通过程序菜单开启应用的日志信息差了一个东西cat=[android.intent.category.LAUNCHER],通过快捷方式开启应用并没有打印出这个属性,所以就尝试在快捷方式创建的时候给他的intent添加一个属性,  

ComponentName comp = new ComponentName(this.getPackageName(), this.getPackageName() + "." +this.getLocalClassName());  
  Intent intent = new Intent(Intent.ACTION_MAIN).setComponent(comp);
  intent.addCategory(Intent.CATEGORY_LAUNCHER);
  shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);

其中,关键的就是intent.addCategory(Intent.CATEGORY_LAUNCHER);  完美解决了标题提到的问题!

目录
相关文章
|
6月前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
111 1
|
编解码 Android开发
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
569 0
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
|
XML API Android开发
Android长按图标展示快捷方式
这个特性,可以追溯到Android 7.1,也就是在7.1之后的系统,如果app支持,可以通过长按app图标展示一些快捷操作
183 0
|
编解码 Android开发
性能优化:Android中Bitmap内存大小优化的几种常见方式
性能优化:Android中Bitmap内存大小优化的几种常见方式
|
开发工具 Android开发
Android推送集成方案总结
刚做完推送集成方案,记录下坑。 这里记录的特性和使用时针对写blog时采用的sdk的,具体使用流程和限制还请参考官方给出的sdk. #### 1、推送规则 小米手机用小米推送; 华为手机用华为推送; 其他手机用友盟推送。
|
存储 编解码 前端开发
Android自定义控件(八)——详解创建bitmap的方式
Android自定义控件(八)——详解创建bitmap的方式
289 0
Android自定义控件(八)——详解创建bitmap的方式
|
XML Android开发 数据格式
Android自定义控件(五)——圆形头像最简单的实现方式
Android自定义控件(五)——圆形头像最简单的实现方式
506 0
Android自定义控件(五)——圆形头像最简单的实现方式
|
存储 Java Android开发
Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵
Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵
191 0
Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵
|
存储 XML 设计模式
一个简单的Android网络访问全局码判断及通用数据解析方案
我们在开发中,网络请求经常会遇到各种错误码的判断。比如下面这样:
145 0
|
存储 前端开发 数据管理
淘宝安卓端搜索架构升级总结
推荐语:这篇文章图文并茂地介绍了淘宝搜索滚动容器的技术演进过程,结合代码讲解页面结构划分、数据处理、交互效果,还包含了对逻辑抽象、功能拓展的思考,最后总结了可复用的架构。非常具有实践意义,推荐阅读学习! ——大淘宝技术终端开发工程师 门柳
354 0
淘宝安卓端搜索架构升级总结