一、Shortcut 简介

Shortcut 是 Android 7.1 (API Level 25) 的新特性,类似于苹果的 3D Touch ,但并不是压力感应,只是一种长按菜单。Shortcut 是受启动器限制的,也就是说国内大厂的定制系统大多数是不支持的,那些所谓的可以 pin 在桌面上的应用功能的快捷启动图标本质上就是 Shortcut 。

二、Shortcut 在 Xamarin.Forms 中的实现分析

本文讨论的是动态 Shortcut 实现。

实现方式无非两种思路,一种 Native to Forms ,另一种 Forms to Native 。博主最开始考虑的是 Forms to Native ,但没成功。在设置 ShortcutInfo 时需要一个 Intent ,其中一个构造函数为

public Intent(Context packageContext, Type type);

看着很容易,只要传入一个 Content 以及 把对应的页面 typeof 一下即可,但会抛出异常。原因是传入的 Forms Page 类并不是 Java 的原生类型。查阅 Xamarin.Android 的相关文档发现,这个 Type 是必须继承 Activity 类的。那么,所有的 Forms 页面均不可传入,Forms to Native 这条路也就不能走了。

Native to Forms 呢?

既然是需要依赖 Activity 的,那就通过新建一个 Android Activity 去调用 Forms 页面。

三、代码实现

下面新建一个空的 Cross-Platform 项目 ShortcutDemo ,使用 Shared Project 共享代码。(GitHub:https://github.com/ZhangGaoxing/xamarin-forms-demo/tree/master/ShortcutDemo)

修改 Shared Project

添加两个 ContentPage 用作测试。

修改 Xamarin.Android

添加两个活动,ShortcutContainerActivity.cs 与 FormsActivity.cs 。

ShortcutContainerActivity.cs

ShortcutContainerActivity.cs 用来作为展示 Forms 页面的跳板,因此将其继承的 Activity 改成 global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 。同时把 OnCreate 的代码改成如下所示

protected override void OnCreate(Bundle savedInstanceState)
{TabLayoutResource = Resource.Layout.Tabbar;ToolbarResource = Resource.Layout.Toolbar;base.OnCreate(savedInstanceState);global::Xamarin.Forms.Forms.Init(this, savedInstanceState);Intent intent = Intent;// 获取传进来的页面名称string pageName = intent.GetStringExtra("PageName");var app = new App();// 设置显示的页面switch (pageName){case "Page1":app.MainPage = new ShortcutDemo.Views.Page1();break;case "Page2":app.MainPage = new ShortcutDemo.Views.Page2();break;default:break;}LoadApplication(app);
}

要注意的是,顶部的 Activity 特性标签要改动,除了 MainLauncher 要改为 false 以外,其他的全部要和 MainActivity.cs 里的一样,不然会抛出异常,可能是主题不统一的原因。

[Activity(Label = "ShortcutDemo", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

FormsActivity.cs

FormsActivity.cs 作为正常启动应用的活动,只是将其从 MainActivity.cs 中剥离开来。代码如下:

[Activity(Label = "ShortcutDemo", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class FormsActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{protected override void OnCreate(Bundle savedInstanceState){TabLayoutResource = Resource.Layout.Tabbar;ToolbarResource = Resource.Layout.Toolbar;base.OnCreate(savedInstanceState);global::Xamarin.Forms.Forms.Init(this, savedInstanceState);LoadApplication(new App());}
}

MainActivity.cs

MainActivity.cs 作为应用程序的入口,由于 Forms 的初始化以及加载已被剥离至 FormsActivity.cs 中,可将 MainActivity.cs 的继承改为 Activity 类。

  1. 在其中添加一个 SetShortcut() 方法用于设置 Shortcut 。首先添加一个 List 用于存放 ShortcutInfo,以备最后动态设置 Shortcut 作为参数传入。
List<ShortcutInfo> shortcutInfoList = new List<ShortcutInfo>();
  1. 接下来实例化一个 Intent 。其中 SetClass 将跳板活动 ShortcutContainerActivity 传入;SetAction 是必须设置的,要不然报错都不知道怎么回事;PutExtra 用于向下一个活动传递参数,我们这里传入的名称用于在跳板活动里设置 MainPage 。
Intent page1 = new Intent();
page1.SetClass(this, typeof(ShortcutContainerActivity));
page1.SetAction(Intent.ActionMain);
page1.PutExtra("PageName", "Page1");
  1. 下面实例化 ShortcutInfo 。SetRank 为设置排序序号,最多显示5个 Shortcut ,也就是 0-4 ;SetIcon 为设置图标;SetShortLabel 与 SetLongLabel 则是设置长名称与段名称;SetIntent 则把上一步实例化的 Intent 传入;最后将其加入 List 。
ShortcutInfo page1Info = new ShortcutInfo.Builder(this, "Page1").SetRank(0).SetIcon(Icon.CreateWithResource(this, Resource.Drawable.Page1)).SetShortLabel("Page1").SetLongLabel("Page1").SetIntent(page1).Build();
shortcutInfoList.Add(page1Info);
  1. 最后获取 ShortcutManager 进行动态设置 Shortcut
ShortcutManager shortcutManager = (ShortcutManager)GetSystemService(Context.ShortcutService);
shortcutManager.SetDynamicShortcuts(shortcutInfoList);

因此全部的 MainActivity.cs 的代码如下:

[Activity(Label = "ShortcutDemo", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : Activity
{protected override void OnCreate(Bundle bundle){base.OnCreate(bundle);SetShortcut();StartActivity(typeof(FormsActivity));}private void SetShortcut(){List<ShortcutInfo> shortcutInfoList = new List<ShortcutInfo>();Intent page1 = new Intent();page1.SetClass(this, typeof(ShortcutContainerActivity));page1.SetAction(Intent.ActionMain);page1.PutExtra("PageName", "Page1");ShortcutInfo page1Info = new ShortcutInfo.Builder(this, "Page1").SetRank(0).SetIcon(Icon.CreateWithResource(this, Resource.Drawable.Page1)).SetShortLabel("Page1").SetLongLabel("Page1").SetIntent(page1).Build();shortcutInfoList.Add(page1Info);Intent page2 = new Intent();page2.SetClass(this, typeof(ShortcutContainerActivity));page2.SetAction(Intent.ActionMain);page2.PutExtra("PageName", "Page2");ShortcutInfo page2 = new ShortcutInfo.Builder(this, "Page2").SetRank(1).SetIcon(Icon.CreateWithResource(this, Resource.Drawable.Page2)).SetShortLabel("Page2").SetLongLabel("Page2").SetIntent(page2).Build();shortcutInfoList.Add(page2);ShortcutManager shortcutManager = (ShortcutManager)GetSystemService(Context.ShortcutService);shortcutManager.SetDynamicShortcuts(shortcutInfoList);}
}

四、效果图

转载于:https://www.cnblogs.com/zhanggaoxing/p/8159248.html

张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用相关推荐

  1. 张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )...

    所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色 ...

  2. Xamarin.Forms开发实战基础篇大学霸内部资料

    Xamarin.Forms开发实战基础篇大学霸内部资料 介绍:本教程是国内第一本Xamarin.Forms开发专向教程.本教程针对Xamarin.Forms初学用户,全面细致的讲解Xmarin.For ...

  3. xamarin android 标签,安卓端Tabbedpage调整在底部位置和标签及取消Android API28 以下的点击特效—-xamarin.forms学习笔记(一)...

    使用tabbedpage时将安卓端导航放在底部,官网也有说明方法.总结: xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x ...

  4. Xamarin.forms 学习笔记

    Xamarin.Forms 是一个开放源代码 UI 框架. 通过 Xamarin.Forms,开发人员可从单个共享基本代码生成 Xamarin.Android.Xamarin.iOS 和 Window ...

  5. xamarin c#开发ios/android 应用

    最近项目需要开发手机客户端,而现在项目又是微软的项目,所以正在考虑用xamarin c#开发ios 应用,这方面的资料不是很多,下面是一些资料的汇总 等研究一段时间再写的使用心得. xamarin 的 ...

  6. VS2019使用 Xamarin.Forms开发iOS 配置指南

    [原创 2021.12.02] csdn上很少写文章,这次整理了一下,贴上来,希望对需要的盆友有帮助. 花了几天时间,过了很多坑.下面列的版本号不要错,不然后面会让人崩溃. 下载并安装VMware 1 ...

  7. Android源码开发笔记 -- Android数据库,屏幕休眠时间

    1. Android数据库问题(以下描述引用及参考http://blog.csdn.net/yin1031468524/article/details/71512996) 在Android7.0之后, ...

  8. Android开发笔记——Android 9发送通知

    Android 9 发送通知 发送通知 布局文件 程序代码 运行截图 发送通知 布局文件 <?xml version="1.0" encoding="utf-8&q ...

  9. android 弹窗圆角,Android开发笔记: Android最简单的圆角提示框

    1 创建drawable文件 all_radius.xml 圆角值为20dp,背景颜色为box,边框颜色为border,可以自己定义一个颜色 android:topLeftRadius="2 ...

最新文章

  1. C++ Primer 读书笔记 (1)
  2. Software caused connection abort: recv failed
  3. linux图形界面基本知识(X、X11、Xfree86、Xorg、GNOME、KDE之间的关系)
  4. 网站建设之前需要先了解目标受众
  5. python变量运算符_Python(三) 变量与运算符
  6. BPSK信号matlab,BPSK信号调制解调与MATLAB仿真.docx
  7. 新版知识付费系统付费阅读小程序源码知识付费平台
  8. 2020-爬虫技术ftx
  9. Opencv--(x,y),(width,height)及(cols,rows)的关系
  10. 95-190-542-源码-window-清除器(Evictors)-CountEvitor简介
  11. 谈Flash中的鼠标响应
  12. 类的数据成员的一些注意事项
  13. java opencv去除干扰线_电子产品硬件研发—提高抗干扰性能的常用方法
  14. Java的第一个你好世界
  15. 区间对比_预算1015万元区间 国内在售街车综合实力对比
  16. 4、c++头文件、源文件使用小记
  17. MySQL用户管理语句001
  18. 金多多简述调整浪的特征十分明显
  19. 【JS】1126- 如何更好的取消一个promise?
  20. C语言为什么不执行数组下标的有效性检查

热门文章

  1. Windows使用PPTP连接后自动掉线及无法打开内网网站问题解决
  2. 菏泽一中2021级高考成绩查询入口,浓浓母校情!菏泽一中举行2021届高三年级离校祝福励志活动...
  3. unity1——terrain地形详解
  4. 代码整洁之道精华——序言
  5. Python3 字典浅析
  6. HTML圆和圆角柜形的制作,中式家具系列之柜类——圆角柜
  7. css渐变 百分比的理解
  8. work group和domain的区别
  9. 【股市大金牛-终极必涨系列】《猎杀涨庄图解》1.1-1.4 -- 高级实战技术
  10. 《永远有多远?》对我而言,FOREVER只是一种期待,一种渴望或者一种淡淡的心情...