胡凯

Android Notes - Activity生命周期中的onSaveInstanceState

| Comments

记录下Activity生命周期中的onSaveInstanceState(Bundle outState)

onSaveInstanceState与onRestoreInstanceState的作用:

在资源紧张的情况下,系统会选择杀死一些处于非栈顶的Activity来回收资源。 为了能够让这些可能被杀死的Activity能够在恢复显示的时候状态不丢失,所以需要在Activity从栈顶往下压的时候提供onSaveInstanceState的回调用来提前保存状态信息。

而onRestoreInstanceState则是在这个Activity真的回收掉之后的恢复显示阶段用来恢复之前保存的数据。

onSaveInstanceState与onRestoreInstanceState的调用时机:

只要某个Activity是做入栈并且非栈顶时(启动跳转其他Activity或者点击Home按钮),此Activity是需要调用onSaveInstanceState的, 如果Activity是做出栈的动作(点击back或者执行finish),是不会调用onSaveInstanceState的。

只有在Activity真的被系统非正常杀死过,恢复显示Activity的时候,就会调用onRestoreInstanceState。

Sample Code

  • 从ActivityA启动ActivityB执行顺序是:A:onCreate -> A:onStart -> A:onResume -> B:onCreate -> B:onStart -> B:onResume -> A:onSaveInstanceState –> A:onStop。
  • 正常流程从ActivityB点击Back按钮或者是触发finish方法回退到ActivityA,执行顺序是:B:finish –> B:onPause –> A: onRestart –> A:onStart -> A:onResume -> B: onStop –> B:onDestroy。
  • 若启动ActivityB之后,选择点击Home按钮,程序退到后台,那么执行顺序是:B:onPause -> B:onSaveInstanceState -> B:onStop。
  • 程序在后台的时候,选择主动杀死程序进程,然后再从桌面点击应用启动,会显示之前的ActivityB,执行顺序是:B:onCreate -> B:onStart –> B:onRestoreInstanceState - > B:onResume。
  • 点击Back按钮或者是执行Activity B里面提供的finish方法:B:finish –> B:onPause –> A:onCreate -> A:onStart -> A:onRestoreInstanceState -> A:onResume -> B:onStop -> B:onDestory。
  • 最后再点击Back按钮或是执行Activity A里面的finish方法退出程序:A:finish -> A:onPause –> A:onStop -> A:onDestory。

Android Training - 创建可穿戴应用(5 - 通过蓝牙进行调试)

| Comments

你可以通过蓝牙来调试你的可穿戴应用,通过蓝牙把调试数据输出到手持设备上,手持设备是有连接到开发电脑上的。

搭建好设备用来调试

  • 开启手持设备的USB调试:
    • 打开设置应用并滑动到底部。
    • 如果在设置里面没有开发者选项,点击关于手机,滑动到底部,点击build number 7次。
    • 返回并点击开发者选项。
    • 开启USB调试。
  • 开启可穿戴设备的蓝牙调试:
    • 点击主界面2次,来到Wear菜单界面。
    • 滑动到底部,点击设置。
    • 滑动到底部,如果没有开发者选项,点击Build Number 7次。
    • 点击开发者选项。
    • 开启蓝牙调试。

Android Training - 创建可穿戴应用(4 - 打包可穿戴应用)

| Comments

当发布应用给用户之前,你必须把可穿戴应用打包到手持应用内。因为不能直接在可穿戴设备上浏览并安装应用。如果打包正确,当用户下载手持应用时,系统会自动下发可穿戴应用到匹对的可穿戴设备上。

Note: 如果开发时签名用的是debug key,这个特性是无法正常工作的。在开发时,需要使用adb install的命令或者Android Studio来安装可穿戴应用。

使用Android Studio打包

在Android Studio中打包可穿戴应用有下面几个步骤:

  1. 在手持应用的buidl.gradle文件中把可穿戴应用声明为依赖:
1
2
3
4
5
dependencies {
   compile 'com.google.android.gms:play-services:5.0.+@aar'
   compile 'com.android.support:support-v4:20.0.+''
   wearApp project(':wearable')
}

Android Training - 创建可穿戴应用(3 - 添加语音能力)

| Comments

语音指令是可穿戴体验的一个重要的部分。这使得用户可以释放双手,快速发出指令。穿戴提供了2种类型的语音操作:

  • 系统提供的

    这些语音指令都是基于任务的,并且内置在Wear的平台内。你在activity中过滤你想要接收的指令。例如包含”Take a note” 或者 “Set an alarm”的指令。

  • 应用提供的

    这些语音指令都是基于应用的,你需要像声明一个Launcher Icon一样定义这些指令。用户通过说”Start XXX”来使用那些语音指令,然后会启动你指定启动的activity。

声明系统提供的语音指令

Android Wear平台基于用户的操作提供了一些语音指令,例如”Take a note” 或者 “Set an alarm”。用户发出想要做的操作指令,让系统寻找应该启动最合适的activity。

当用户说出语音指令时,你的应用能够被过滤出来启动一个activity。如果你想要启动一个service在后台执行任务,需要显示一个activity呈现作为线索。当你想要废弃这个可见的线索时,需要确保执行了finish()。