Android 中使用 ProgressDialog 显示进度对话框

代码与范例:

说明:通过进度对话框,可以提示用户应用当前正在执行处理,减少用户因 UI 长时间阻塞而产生的烦躁感。此外,ProgressDialog 类还支持 setSecondaryProgress(),以及继承自 Dialog 类的 setCancelable() 和 AlertDialog 类的 setButton() 等方法。

Android 中获取设备数据网络状态

代码与范例:

说明:通过 isConnected 与 isWiFi 可以判断设备当前是否建立数据通信连接,及连接类型是否为 WiFi。

Android 中 Activity,Task,Stack 以及 Launch Mode 的一些说明

Acitivty 是 Android 应用框架中最主要的组件之一。可以 Task/ Stack 的机制来管理 Activity 的行为模式。在 Android 的官方文档里已经对 Activity 的属性以及 Task/Stack 的概念进行了说明。在《应用程序基础》一文中也有对这一主题的相关说明。这里专门对此进行进一步的说明。

Stack 保存了一个应用程序的所有没有被销毁(destroy)的 Activity。例如依次启动了 A、B、C 三个 Activity 之后,该 stack 的状态即为 |A-B-C。当 C 执行了 finish() 方法或是用户点击了返回键之后,stack 的状态变为了 |A-B。

而 task 则可以理解为是在 stack 中对 activity 进行了一种分组。例如:|1A-1B- 2A-2B-2C- 3A 中根据后缀可以分为三个不同的 task。这时所显示的是 3A,三个 task 的根 Activty 分别是 1A、2A、3A。通常,一个 task 中的 activity 是成组移动的。例如通过长按 HOME 键选择了 2C 之后,stack 将变为 |1A-1B- 3A- 2A-2B-2C。默认情况下,所有的 activity 将会属于同一个 task。不过各个 activity 之间的从属关系也能够通过 taskAffinity 被重新定义。而如果 Intent 对象含有 FLAG_ACTIVITY_NEW_TASK 旗标,则将会选择一个新的 task。

不同的启动模式也会影响 task 的分配:

如果用户长时间不使用一个 task,该 task 就会被清除以释放内存。不过根 Activity 将会被保留。例如:|1A-1B- 2A-2B-2C- 3A 在这种情况下将变为 |1A- 2A- 3A。如果将根 Activity 的 alwaysRetainTaskState 属性设为 true,则该 task 中的所有活动都将被始终保留。如果将根 Activity 的 clearTaskOnLaunch 属性设为 true,则在用户离开该 task 时包括根 Activity 在内的这一 task 将被完整清除。如果将 task 中的某个 Activity 的 finishOnTaskLaunch 属性设为 true,则在离开该 task 并返回之后,这一 Activity 将被清除。

Android 中创建震动通知

代码与范例:

说明:这时不会生成状态栏通知。需要注意的是,要在 manifest 中添加 <uses-permission android:name=”android.permission.VIBRATE” /> 权限。

Android 中创建状态栏通知

代码与范例:

说明:NotificationManager 可以通过 getSystemService(NOTIFICATION_SERVICE) 方法取得。它本身还有一些其他的便利方法:

cancel(int id)
删除指定 id 的通知。

cancelAll()
删除本应用程序发出的所有通知。

Android 中一些特定情况下的活动生命周期

Android 中一个 Activity 的标准生命周期可以参考「应用程序基础」中的活动的生命周期一节。

而下面是一些特定情况下的生命周期:

— 从 Launcher 中启动 —

onApplyThemeResource(Resources.Theme theme, int resid, boolean first)
onCreate()
onWindowAttributesChanged (WindowManager.LayoutParams params)
onContentChanged()
onStart()
(*onRestoreInstanceState(Bundle))
onPostCreate(Bundle)
onResume()
onPostResume()
onAttachedToWindow()
onWindowFocusChanged (boolean hasFocus) : true

— 按下 home 键  —

onUserInteraction()
onUserLeaveHint()
onSaveInstanceState()
onResume()
onPostResume()
onWindowFocusChanged (boolean hasFocus) : false
onCreateDescription() : null
onStop()

— 通过长按 Home 键以启动 —

onRestart()
onStart()
onResume()
onWindowFocusChanged (boolean hasFocus) : true

— 通过 Back 键终止 —

onUserInteraction()
onResume()
onWindowFocusChanged (boolean hasFocus) : false
onStop()
onDestroy()
onDetachedFromWindow()

Android 中判断 Home 键被按下

代码与范例:

说明:事实上,Android 本身并不支持对 Home (物理按键或是虚拟按键)键按下的判断。但是 onUserLeaveHint() 是按下 Home 键后一个 Activity 必经的方法,所以在很多时候可以借此实现对 Home 键按下的判断。值得注意的是,这一方法有一个副作用,即,在其他一些离开当前 Activity 的场合下该方法也会被调用。如有必要,可以通过设置 flag 等方式加以区分。

Android 中菜单(Menu)键以及 ActionBar 相关问题

Android 进入 4.0 (ICS)版本之后,虚拟按键渐渐得到了推广。同时,传统的物理菜单键逐渐被淘汰。尤其是对于平板设备,自从 Android 3.0 版本起就不再支持实体菜单键,菜单被收纳至顶部 ActionBar 之中。这一改变事实上引起了不少版本兼容性问题。

从 Android 3.0 (Honeycomb)起,程序不得不同时考虑具备传统菜单键和不具备传统菜单键的设备。这种情况下,可以通过 Action Bar 或者 OverflowButton 实现菜单功能。

在 Android 3.0 以上的设备上运行以 Android 2.3(GingerBread)或更早版本为目标版本(Target Version)的程序时,将会自动添加 LegacyOverflowButton。这是一个显示在应用切换键图标右侧的虚拟按键,功能和物理菜单键相同。如果程序的目标版本高于 Android 2.3,则不会显示该虚拟菜单键。

不过也有一个例外。在同时满足以下条件时,上述的 LegacyOverflowButton 仍然会被显示:系统版本为 Android 4.0 或更新,且设备类型为智能手机而非平板电脑;程序的 minSdkVersion 小于 10(即 Android 2.3 或更早), targetSdkVersion 为 11~13,不使用 ActionBar。

总结来说:

  • 目标版本为 Android 3.0 或更新的程序需要通过 ActionBar 提供菜单功能。但是如果具备实体菜单键,也可以调用传统的菜单(OptionMenu)。
  • 目标版本为 Android 2.3 或更早的程序通过 legacyOverflowButton 在新版系统上提供菜单功能。
  • 目标版本为 Android 3.0~3.2,minSdkVersion 小于 10(即 Android 2.3 或更早),不使用 ActionBar 的程序,在系统版本为 Android 4.0 或更新的智能手机中通过 legacyOverflowButton 在新版系统上提供菜单功能。
  • 目标版本为 Android 3.0~3.2,minSdkVersion 小于 10(即 Android 2.3 或更早),不使用 ActionBar 的程序,在系统版本为 Android 3.x 的平板电脑上无法使用菜单功能
  • 目标版本为 Android 4.0 或更新,不使用 ActionBar 的程序,在没有物理菜单键的设备上无法使用菜单功能

如要要使目标版本为 Android 2.3 或更早的程序也能使用 ActionBar,可以采用以下的方法:

res/values/styles.xml

<resources>
<style name=”AppTheme” parent=”android:Theme.Light” />
</resources>

res/values-v11/styles.xml

<resources>
<style name=”AppTheme” parent=”android:Theme.Holo.Light” />
</resources>

AndroidManifest.xml

<application
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >