wear os 学习分享(一)之保持应用可见

一、聊聊天

最近两天下班后看Android 开发文档  (https://developer.android.google.cn 不能访问的小伙伴自行翻墙,我用的是谷歌访问助手插件) 收获了很多新的知识点,也补充了自己的知识库。

因为最近有意向开发android + wear os 的 一套小软件,所以提前学习以下。

(ps:静等果冻的原型  大家可以微博关注他,'搞机圈圈主',为人幽默风趣,很容易相处。)

二、学习之路

    “某些 Wear 应用在对用户始终可见时作用最大。例如,在室外跑步的用户看一眼自己的穿戴式设备,就能了解跑步距离和所用时间;或者只需在其穿戴式设备上录入购物清单,就能在市场购物时快速了解还有哪些商品没有购买。让应用始终可见对电池续航时间有影响,因此在为应用添加这项功能时,您应该仔细考虑这种影响。

运行 Android 5.1 或更高版本的 Android Wear 设备允许应用在节省电池电量的同时保持前台运行。Android Wear 应用可以控制穿戴式设备在低功耗微光模式下运行时屏幕上的显示内容。同时运行在微光和交互模式下的 Wear 应用称作始终开启应用。”  --文档中第一段话

使用过智能手表的童鞋都知道那种痛苦,某个应用一小会不操作就黑屏退出了,手指得不停的去碰屏幕,让你觉得心里不爽。So,这篇文章就是解决这些问题的。

以前我开发一款阅读软件的时候,使用过这个功能。 就是保持屏幕长亮,这个功能可能会对电池电量消耗大一点。

使用的代码是:

//屏幕常亮

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

这个会对屏幕进行锁操作,所以 如果你视频播放的时候使用这个代码,记得视频暂停的时候使用:

//释放屏幕

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

三、改进

    人总是得进步的,有好的东西要去学会接受并学会它,驾驭它。官方文档写的也很详细,我这里掺杂自己的理解,把文档叙述的更容易让人理解一点。

1、配置您的开发项目  (官网文档中介绍)

要在 Wear 应用中支持微光模式,您必须更新 Android SDK 并配置您的开发项目。请按以下步骤做出必要的更改:

更新您的 SDK,使其包括 Android 5.1 (API 22) 或更高版本平台,后者提供的 API 可让 Activity 转入微光模式。如需了解有关如何更新 SDK 的详细信息,请参阅添加 SDK 软件包

创建一个项目或修改现有项目,使其以 Android 5.1 或更高版本为目标平台。这意味着,您必须将清单 targetSdkVersion 设置为 22 或更高。

如果您想在低于 Android 5.1 的版本上支持设备,请将 manifest minSdkVersion 设置为 20 或更高。如需了解有关后向兼容性的详细信息,请参阅保持后向兼容性(下面会有)。

向您的 build.gradle 文件添加或更新下列依赖项:

dependencies {

    ...

    compile 'com.google.android.support:wearable:1.2.0'

    provided 'com.google.android.wearable:wearable:1.0.0'

}

注:provided 依赖项可确保为支持微光模式而在运行时加载的类在编译时同样可用。

向穿戴式设备应用 manifest 添加穿戴式设备共享库条目:


                android:required="false" />

  ...

向手持式和穿戴式设备应用 manifest 添加 WAKE_LOCK 权限:  有很多童鞋写完activity 一个酷炫的功能后测试时有时会忘掉权限的问题,所以这个权限不要忘记~

保持应用可见

某些 Wear 应用在对用户始终可见时作用最大。例如,在室外跑步的用户看一眼自己的穿戴式设备,就能了解跑步距离和所用时间;或者只需在其穿戴式设备上录入购物清单,就能在市场购物时快速了解还有哪些商品没有购买。让应用始终可见对电池续航时间有影响,因此在为应用添加这项功能时,您应该仔细考虑这种影响。

运行 Android 5.1 或更高版本的 Android Wear 设备允许应用在节省电池电量的同时保持前台运行。Android Wear 应用可以控制穿戴式设备在低功耗微光模式下运行时屏幕上的显示内容。同时运行在微光和交互模式下的 Wear 应用称作始终开启应用。

本课程介绍如何让您的穿戴式设备应用始终开启,如何在微光模式下更新屏幕,以及如何保持后向兼容性。

在穿戴式设备应用中启用微光模式

对于新项目和现有项目,您可以通过更新开发项目配置向 Wear 应用添加微光模式支持。在您完成项目配置后,扩展 WearableActivity 类,该类提供了在应用中启用微光模式所需的全部函数。下文将详细介绍这些步骤。

配置您的开发项目

要在 Wear 应用中支持微光模式,您必须更新 Android SDK 并配置您的开发项目。请按以下步骤做出必要的更改:

更新您的 SDK,使其包括 Android 5.1 (API 22) 或更高版本平台,后者提供的 API 可让 Activity 转入微光模式。如需了解有关如何更新 SDK 的详细信息,请参阅添加 SDK 软件包

创建一个项目或修改现有项目,使其以 Android 5.1 或更高版本为目标平台。这意味着,您必须将清单 targetSdkVersion 设置为 22 或更高。

如果您想在低于 Android 5.1 的版本上支持设备,请将 manifest minSdkVersion 设置为 20 或更高。如需了解有关后向兼容性的详细信息,请参阅保持后向兼容性

向您的 build.gradle 文件添加或更新下列依赖项:

dependencies {

    ...

    compile 'com.google.android.support:wearable:1.2.0'

    provided 'com.google.android.wearable:wearable:1.0.0'

}

注:provided 依赖项可确保为支持微光模式而在运行时加载的类在编译时同样可用。

向穿戴式设备应用 manifest 添加穿戴式设备共享库条目:


                android:required="false" />

  ...

向手持式和穿戴式设备应用 manifest 添加 WAKE_LOCK 权限:

创建一个支持微光模式的 Activity

要在您的 Activity 中启用微光模式,请使用 WearableActivity 类和函数。

创建一个用于扩展 WearableActivity 的 Activity。

在您的 Activity 的 onCreate() 函数中,调用 setAmbientEnabled() 函数。

public class MainActivity extends WearableActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    //启动微光模式

    setAmbientEnabled();

    // 更多操作

    ...

}

当Activity切换到微光模式后,系统会自动调用Activity中的一个onEnterAmbient()函数,需要重写此方法。官方例子:

@Override

public void onEnterAmbient(Bundle ambientDetails) {

    super.onEnterAmbient(ambientDetails);

    // 把文本的颜色设置为白色

    mStateTextView.setTextColor(Color.WHITE);

    //  停用抗锯齿

    mStateTextView.getPaint().setAntiAlias(false);

}

当用户点按屏幕或抬起手腕时,Activity 会从微光模式切换至交互模式。系统会调用 onExitAmbient() 函数。需要重写此方法以更新布局。官方例子:

@Override

public void onExitAmbient() {

    super.onExitAmbient();

    //  设置文本颜色为绿色

    mStateTextView.setTextColor(Color.GREEN);

    //  启用抗锯齿

    mStateTextView.getPaint().setAntiAlias(true);

}

基础的api已经讲解完毕,对于开发者来说应该很容易理解和上手。

更高级点的功能还有,如果不过瘾 接着看下面的。

有的童鞋可能需要 在微光模式下更新app的数据或内容。

‘微光模式允许您用提供给用户的新信息更新屏幕,但您必须小心地在显示更新与电池续航时间之间保持平衡。您绝对应该考虑只重写 onUpdateAmbient() 函数,以在微光模式下每分钟更新一次屏幕。如果您的应用需要更频繁的更新,请考虑电池续航时间与更新频率之间的取舍。要节约电池电量,更新频率不应高于每 10 秒一次。但实际上,您更新应用的频率应小于该值。‘                  ------官网文档

官方建议 每分钟更新一次屏幕,就可以重写 onUpdateAmbient() 函数,这个方法中是每分钟更新一次屏幕,可以把更新的操作放入此方法中。  官方例子:

@Override

public void onUpdateAmbient() {

    super.onUpdateAmbient();

    // Update the content

}

更频繁的更新屏幕  觉得官网这个文档这个流程写的很详细,本人不再赘述。

对于需要更频繁更新的应用,例如健身、计时和旅行信息应用,请使用 AlarmManager 对象来唤醒处理器并更频繁地更新屏幕。

要实现在微光模式下更频繁更新内容的闹铃,请按以下步骤操作:

准备闹铃管理器。

设置更新的频率。

当 Activity 切换至微光模式或当前处于微光模式时安排下一次更新。

当 Activity 切换至交互模式或 Activity 停止时取消闹铃

注:闹铃管理器可能会在触发时创建新的 Activity 实例。为防止出现这种情况,请确保在 manifest 中使用 android:launchMode="singleInstance" 参数声明您的 Activity。

下文将详细介绍这些步骤。

准备闹铃管理器

闹铃管理器启动一个挂起 intent,后者更新屏幕并安排下一次闹铃。下例显示了如何在您的 Activity 的 onCreate() 函数中声明闹铃管理器和挂起 intent:

private AlarmManager mAmbientStateAlarmManager;

private PendingIntent mAmbientStatePendingIntent;

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setAmbientEnabled();

    mAmbientStateAlarmManager =

        (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent ambientStateIntent =

        new Intent(getApplicationContext(), MainActivity.class);

    mAmbientStatePendingIntent = PendingIntent.getActivity(

        getApplicationContext(),

        0,

        ambientStateIntent,

        PendingIntent.FLAG_UPDATE_CURRENT);

    ...

}

当闹铃触发并启动挂起 intent 时,后者通过重写 onNewIntent() 函数更新屏幕并安排下一次闹铃:

@Override

public void onNewIntent(Intent intent) {

    super.onNewIntent(intent);

    setIntent(intent);

    // Described in the following section

    refreshDisplayAndSetNextUpdate();

}

更新屏幕并安排数据更新

在该示例 Activity 中,闹铃管理器在微光模式下每 20 秒触发一次。如果计时器开始计时,闹铃会触发 intent,后者更新屏幕,然后设置下次更新的延迟。

下例显示了如何在屏幕上更新信息以及为下次更新设置闹铃:

// Milliseconds between waking processor/screen for updates

private static final long AMBIENT_INTERVAL_MS = TimeUnit.SECONDS.toMillis(20);

private void refreshDisplayAndSetNextUpdate() {

    if (isAmbient()) {

        // Implement data retrieval and update the screen for ambient mode

    } else {

        // Implement data retrieval and update the screen for interactive mode

    }

    long timeMs = System.currentTimeMillis();

    // Schedule a new alarm

    if (isAmbient()) {

        // Calculate the next trigger time

        long delayMs = AMBIENT_INTERVAL_MS - (timeMs % AMBIENT_INTERVAL_MS);

        long triggerTimeMs = timeMs + delayMs;

        mAmbientStateAlarmManager.setExact(

            AlarmManager.RTC_WAKEUP,

            triggerTimeMs,

            mAmbientStatePendingIntent);

    } else {

        // Calculate the next trigger time for interactive mode

    }

}

安排下一次闹铃

通过重写 onEnterAmbient() 函数和 onUpdateAmbient() 函数,安排闹铃在 Activity 进入微光模式或 Activity 已处于微光模式时更新屏幕:

@Override

public void onEnterAmbient(Bundle ambientDetails) {

    super.onEnterAmbient(ambientDetails);

    refreshDisplayAndSetNextUpdate();

}

@Override

public void onUpdateAmbient() {

    super.onUpdateAmbient();

    refreshDisplayAndSetNextUpdate();

}

注:在本例中,每当需要更新屏幕时,就会调用 refreshDisplayAndSetNextUpdate() 函数。如需查看关于何时调用该函数的更多示例,请参阅 AlwaysOn 示例。

取消闹铃

当设备切换至交互模式时,在 onExitAmbient() 函数中取消闹铃:

@Override

public void onExitAmbient() {

    super.onExitAmbient();

    mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);

}

当用户退出或停止您的 Activity 时,在 Activity 的 onDestroy() 函数中取消闹铃:

@Override

public void onDestroy() {

    mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);

    super.onDestroy();

}

保持后向兼容性

支持微光模式的 Activity 在运行的 Android 版本低于 5.1(API 级别 22)的 Wear 设备上会自动回退为普通 Activity。在这些版本的 Android 上,无需为支持设备而编写专门的应用代码。当设备切换至微光模式时,会返回主屏幕并退出您的 Activity。

如果您的应用不应在运行 5.1 以下版本 Android 的设备上安装或更新,请使用以下代码更新您的 manifest:

这个保持应用可见的api就分享完毕了,我就是把官网的文档拿来加上自己学习过程中的理解,再分享给大家。

以后学习的心得和感悟还会继续分享,谢谢观看。

与君共勉。                                                               

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容