Android开发学习笔记

z8g 于 2020-06-19 发布

推荐阅读: https://developer.android.google.cn/training/basics/firstapp/creating-project

应用资源

处理配置变更

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    String text = ((newConfig.orientation == ORIENTATION_LANDSCAPE) ? "建议竖屏浏览" :"竖屏");
    Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}

本地化

假设您应用的默认语言是英语。再假设您希望将应用中的所有文本本地化为法语,并将应用中的大部分文本(应用标题除外)本地化为日语。在本例中,您可以创建三个备用 strings.xml 文件,每个文件存储在一个特定于语言区域的资源目录中:

res/values/strings.xml 包含应用使用的所有字符串的英语文本,包括名为 title 的字符串的文本。 res/values-fr/strings.xml 包含所有字符串(包括 title)的法语文本。 res/values-ja/strings.xml 包含除 title 之外的所有字符串的日语文本。 如果基于 Java 的代码引用了 R.string.title,则运行时会发生以下情况:

如果设备设置为非法语的语言,Android 会从 res/values/strings.xml 文件加载 title。 如果设备设置为法语,则 Android 会从 res/values-fr/strings.xml 文件加载 title。 请注意,如果设备设置为日语,Android 会在 res/values-ja/strings.xml 文件中查找 title。但由于该文件中不包含此类字符串,因此 Android 会退回到默认状态,从 res/values/strings.xml 文件中加载英语 title。


标记不应翻译的文本:

<string name="countdown">
	<xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday
</string>

查找语言区域:

Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0);
String locale = primaryLocale.getDisplayName();

通过adb shell更改模拟器语言区域:

adb -e shell
setprop persist.sys.locale fr-CA;stop;sleep 5;start

内嵌资源格式

res/drawable/avd.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rotationGroup"
        android:animation="@anim/rotation" />
</animated-vector>

res/drawable/vectordrawable.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="64dp"
    android:width="64dp"
    android:viewportHeight="600"
    android:viewportWidth="600" >

   <group
        android:name="rotationGroup"
        android:pivotX="300.0"
        android:pivotY="300.0"
        android:rotation="45.0" >
        <path
            android:fillColor="#000000"
            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />

   </group>
</vector>

res/anim/rotation.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/android"
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"

   android:valueTo="360" />

通过AAPT的内嵌资源格式,可以在同一XML文件中定义所有三种资源

res/drawable/avd.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt" >

    <aapt:attr name="android:drawable" >
        <vector
            android:height="64dp"
            android:width="64dp"
            android:viewportHeight="600"
            android:viewportWidth="600" >

           <group
                android:name="rotationGroup"
                android:pivotX="300.0"
                android:pivotY="300.0"
                android:rotation="45.0" >
                <path
                    android:fillColor="#000000"
                    android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />

           </group>
        </vector>
    </aapt:attr>

    <target android:name="rotationGroup">
        <aapt:attr name="android:animation" >
            <objectAnimator
                android:duration="6000"
                android:propertyName="rotation"
                android:valueFrom="0"

               android:valueTo="360" />
        </aapt:attr>
    </target>
</animated-vector>

资源类型

清单文件

下表提供 AndroidManifest.xml 文件中所有有效元素的参考文档链接。

标签 说明
<action> 向 Intent 过滤器添加操作。
<activity> 声明 Activity 组件。
<activity-alias> 声明 Activity 的别名。
<application> 应用的声明。
<category> 向 Intent 过滤器添加类别名称。
<compatible-screens> 指定与应用兼容的每个屏幕配置。
<data> 向 Intent 过滤器添加数据规范。
<grant-uri-permission> 指定父级内容提供程序有权访问的应用数据的子集。
<instrumentation> 声明支持您监控应用与系统进行交互的 Instrumentation 类。
<intent-filter> 指定 Activity、服务或广播接收器可以响应的 Intent 类型。
<manifest> AndroidManifest.xml 文件的根元素。
<meta-data> 可以提供给父级组件的其他任意数据项的名称-值对。
<path-permission> 定义内容提供程序中特定数据子集的路径和所需权限。
<permission> 声明安全权限,可用于限制对此应用或其他应用的特定组件或功能的访问。
<permission-group> 为相关权限的逻辑分组声明名称。
<permission-tree> 声明权限树的基本名称。
<provider> 声明内容提供程序组件。
<receiver> 声明广播接收器组件。
<service> 声明服务组件。
<supports-gl-texture> 声明应用支持的一种 GL 纹理压缩格式。
<supports-screens> 声明应用支持的屏幕尺寸,并为大于此尺寸的屏幕启用屏幕兼容模式。
<uses-configuration> 指明应用要求的特定输入功能。
<uses-feature> 声明应用使用的单个硬件或软件功能。
<uses-library> 指定应用必须链接到的共享库。
<uses-permission> 指定为使应用正常运行,用户必须授予的系统权限。
<uses-permission-sdk-23> 指明应用需要特定权限,但仅当应用在运行 Android 6.0(API 级别 23)或更高版本的设备上安装时才需要。
<uses-sdk> 您可以通过整数形式的 API 级别,表示应用与一个或多个版本的 Android 平台的兼容性。

以下 XML 文件为 AndroidManifest.xml 的一个简单示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.example.myapp">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based upon the package attribute -->
        <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=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>

Activity

Activity简介

6个核心回调: onCreate、onStart、onResume、onPause、onStop、onDestory

回调 触发时机
onCreate 系统首次创建 Activity 时触发