Android移动应用开发教程⑨

  • 本文为第九篇,主要介绍了为活动补充附加信息(利用资源文件配置字符串、利 用元数据传递配置信息、给应用页面注册快捷方式)。
  • 本文是对B站教程动脑学院 Android教程学习过程中所做的笔记!
  • 本文大部分为从视频中选取的知识点,其中有文字和小部分图片是由我自己编写的。
  • 本文承接上一篇文章《Android移动应用开发教程⑧》
  • 下一篇文章《Android移动应用开发教程10》

为活动补充附加信息

一:利用资源文件配置字符串

1.1:直接修改java代码的弊端

利用Bundle固然能在页面跳转的时候传送数据,但这仅限于在代码中传递参数,如果要求临时修改某个 参数的数值,就得去改Java代码。然而直接修改Java代码有两个弊端:

(1)代码文件那么多,每个文件又有许多行代码,一下子还真不容易找到修改的地方。

(2)每次改动代码都得重新编译,让Android Studio编译的功夫也稍微费点时间。

有鉴于此,对于可能手工变动的参数,通常把参数名称与参数值的对应关系写入配置文件,由程序在运 行时读取配置文件,这样只需修改配置文件就能改变对应数据了。

1.2:在xml配置文件中配置字符串参数

res\values目录下面的strings.xml就 用来配置字符串形式的参数,打开该文件,发现里面已经存在名为app_name的字符串参数,它配置的 是当前模块的应用名称。现在可于app_name下方补充一行参数配置,参数名称叫作“weather_str”,参数值则为“晴天”,具体的配置内容如下所示:

<string name="weather_str">晴天</string>

接着打开活动页面的Java代码,调用getString方法即可根据“R.string.参数名称”获得指定参数的字符串值。获取代码示例如下:

// 显示字符串资源
private void showStringResource() {
String value = getString(R.string.weather_str); // 从strings.xml获取名叫
weather_str的字符串值
tv_resource.setText("来自字符串资源:今天的天气是"+value); // 在文本视图上显示文字
}

上面的getString方法来自于Context类,由于页面所在的活动类AppCompatActivity追根溯源来自 Context这个抽象类,因此凡是活动页面代码都能直接调用getString方法。 然后在onCreate方法中调用showStringResource方法就能从资源文件成功读取字符串。

二:利用元数据传递配置信息

2.1:为某个活动提供专属参数

尽管资源文件能够配置字符串参数,然而有时候为安全起见,某个参数要给某个活动专用,并不希望其 他活动也能获取该参数,此时就不方便到处使用getString了。

好在Activity提供了元数据(Metadata) 的概念,元数据是一种描述其他数据的数据,它相当于描述固定活动的参数信息。

2.2:为活动注册元数据

打开 AndroidManifest.xml,在测试活动的activity节点内部添加meta-data标签,通过属性name指定元数据 的名称,通过属性value指定元数据的值。仍以天气为例,添加meta-data标签之后的activity节点如下所示:

扫描二维码关注公众号,回复: 15288496 查看本文章
<activity android:name=".MetaDataActivity">
<meta-data android:name="weather" android:value="晴天" />
</activity>

元数据的value属性既可直接填字符串,也可引用strings.xml已定义的字符串资源,引用格式形如 “@string/字符串的资源名称”。下面便是采取引用方式的activity节点配置:

<activity android:name=".MetaDataActivity">
<meta-data
android:name="weather"
android:value="@string/weather_str" />
</activity>

2.3:读取元数据

配置好了activity节点的meta-data标签,再回到Java代码获取元数据信息,获取步骤分为下列3步:

  1. 调用getPackageManager方法获得当前应用的包管理器。
  2. 调用包管理器的getActivityInfo方法获得当前活动的信息对象。
  3. 活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指定名称的参数值。

把上述3个步骤串起来,得到以下的元数据获取代码:

// 显示配置的元数据
private void showMetaData() {
try {
PackageManager pm = getPackageManager(); // 获取应用包管理器
// 从应用包管理器中获取当前的活动信息
ActivityInfo act = pm.getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
Bundle bundle = act.metaData; // 获取活动附加的元数据信息
String value = bundle.getString("weather"); // 从包裹中取出名叫weather的字符
串
tv_meta.setText("来自元数据信息:今天的天气是"+value); // 在文本视图上显示文字
} 
catch (Exception e) {
e.printStackTrace();
}
}

三:给应用页面注册快捷方式

3.1:手机上的长按快捷菜单

元数据不单单能传递简单的字符串参数,还能传送更复杂的资源数据,从Android 7.1开始新增的快捷方 式便用到了这点,譬如在手机桌面上长按支付宝图标,会弹出如图所示的快捷菜单。

点击菜单项“扫一扫”,直接打开支付宝的扫码页面;点击菜单项“付钱”,直接打开支付宝的付款页面;点 击菜单项“收钱”,直接打开支付宝的收款页面。如此不必打开支付宝首页,即可迅速跳转到常用的App页 面,这便是所谓的快捷方式。

3.2实现快捷方式

那么Android 7.1又是如何实现快捷方式的呢?那得再琢磨琢磨元数据了。原来元数据的meta-data标签 除了前面说到的name属性和value属性,还拥有resource属性,该属性可指定一个XML文件,表示元数 据想要的复杂信息保存于XML数据之中。借助元数据以及指定的XML配置,方可完成快捷方式功能,具体的实现过程说明如下:

首先打开res/values目录下的strings.xml,在resources节点内部添加下述的3组(每组两个,共6个)字 符串配置,每组都代表一个菜单项,每组又分为长名称和短名称,平时优先展示长名称,当长名称放不 下时才展示短名称。这3组6个字符串的配置定义示例如下:

<string name="first_short">first</string>
<string name="first_long">启停活动</string>
<string name="second_short">second</string>
<string name="second_long">来回跳转</string>
<string name="third_short">third</string>
<string name="third_long">登录返回</string>

 接着在res目录下创建名为xml的文件夹,并在该文件夹创建shortcuts.xml,这个XML文件用来保存3组 菜单项的快捷方式定义,文件内容如下所示:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="first"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/first_short"
android:shortcutLongLabel="@string/first_long">
<!-- targetClass指定了点击该项菜单后要打开哪个活动页面 -->
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.ActStartActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:shortcutId="second"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/second_short"
android:shortcutLongLabel="@string/second_long">
<!-- targetClass指定了点击该项菜单后要打开哪个活动页面 -->
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.JumpFirstActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:shortcutId="third"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/third_short"
android:shortcutLongLabel="@string/third_long">
<!-- targetClass指定了点击该项菜单后要打开哪个活动页面 -->
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.chapter04"
android:targetClass="com.example.chapter04.LoginInputActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
</shortcuts>

由上述的XML例子中看到,每个shortcut节点都代表了一个菜单项,该节点的各属性说明如下:

  • shortcutId:快捷方式的编号。
  • enabled:是否启用快捷方式。true表示启用,false表示禁用。
  • icon:快捷菜单左侧的图标。
  • shortcutShortLabel:快捷菜单的短标签。
  • shortcutLongLabel:快捷菜单的长标签。优先展示长标签的文本,长标签放不下时才展示短标签 的文本。

以上的节点属性仅仅指明了每项菜单的基本规格,点击菜单项之后的跳转动作还要由shortcut内部的 intent节点定义,该节点主要有targetPackage与targetClass两个属性需要修改,其中targetPackage属 性固定为当前App的包名,而targetClass属性描述了菜单项对应的活动类完整路径。

然后打开AndroidManifest.xml,找到MainActivity所在的activity节点,在该节点内部补充如下的元数据配置,其中name属性为android.app.shortcuts,而resource属性为@xml/shortcuts:

<meta-data android:name="android.app.shortcuts"android:resource="@xml/shortcuts"
/>

这行元数据的作用,是告诉App首页有个快捷方式菜单,其资源内容参见位于xml目录下的 shortcuts.xml。完整的activity节点配置示例如下:

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 指定快捷方式。在桌面上长按应用图标,就会弹出@xml/shortcuts所描述的快捷菜单 -->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>

然后把测试应用安装到手机上,回到桌面长按应用图标,此时图标下方弹出如图所示的快捷菜单列 表。

猜你喜欢

转载自blog.csdn.net/qq_64618483/article/details/129937879