Android 使用 am 命令启动一个活动组件

am 命令说明

am start -n 命令是 Android 调试桥(ADB)工具的一部分,用于在 Android 设备上启动一个活动。以下是该命令及其组成部分的详细解释:

  • am: 代表 Activity Manager(活动管理器)。它是一个命令行工具,可以用于在 Android 设备上执行各种与活动、服务和广播相关的操作。
  • start: 这个子命令用于启动一个活动。活动表示一个带有用户界面的单个屏幕,启动活动意味着打开一个特定的应用程序界面。
  • -n: 该选项指定你想要启动的活动的组件名称。组件名称由两部分组成:
    • 应用程序的 包名(例如 com.android.gallery3d)。
    • 你想要启动的活动的 完整类名(例如 .app.GalleryActivity)。

组件名称的格式为 package_name/.ActivityName

使用示例

启动图库应用的主活动:

adb shell am start -n com.android.gallery3d/.app.GalleryActivity
  • adb shell: 在设备上打开一个命令行界面。
  • am start -n: 启动指定的活动。
  • com.android.gallery3d/.app.GalleryActivity: 指定要启动的包名和活动。

其他选项

  • --display <display_id>: 如果设备有多个显示屏,可以指定使用哪个显示屏。
  • -d : 指定一个数据 URI(例如文件路径或网页链接),活动在启动时可以使用这个 URI。
  • -a <action>: 指定要执行的操作,例如 android.intent.action.VIEW

实际示例

如果你想在显示屏 3 上打开图库应用中的特定图片:

adb shell am start -n com.android.gallery3d/.app.GalleryActivity --display 3

这个命令将在显示屏 3 上打开图库应用的 GalleryActivity

如何获取 package_name 以及 activity_name

pm list packages 命令获取当前系统中的所有 package。

130|console:/ # pm list packages
......
package:com.android.internal.systemui.navbar.gestural
package:com.android.gallery3d
package:com.android.providers.userdictionary
......

以 gallery3d com.android.gallery3d 为例:

console:/ # dumpsys package com.android.gallery3d | grep -A 1 'MAIN'
      android.intent.action.MAIN:[ 1080.400705] servicemanager: Since 'artd' could not be found, trying to start it as a lazy AIDL service. (if it's not configured to be a lazy service, it may be stuck starting or still starting).

        c99ebe com.android.gallery3d/.app.GalleryActivity filter 92aab1f
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.DEFAULT"
--
          Action: "android.intent.action.MAIN"
        be96ced com.andro[ 1080.418995] init: starting service 'artd'...
id.gallery3d/.app.Gallery filter de1c722
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.DEFAULT"
--
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.DEFAULT"
--
[ 1080.446599] init: ... started service 'artd' has pid 2312
[ 1080.458298] BpBinder: onLastStrongRef automatically unlinking death recipients: 
    privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE HAS_DOMAIN_URLS PRODUCT PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
    forceQueryable=false
--
    privatePkgFlags=[ PRI[ 1080.472553] init: Control message: Processed ctl.interface_start for 'aidl/artd' from pid: 248 (/system/bin/servicemanager)
VATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE HAS_DOMAIN_URLS PRODUCT PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
    apexModuleName=null

关键信息:c99ebe com.android.gallery3d/.app.GalleryActivity filter 92aab1f

对应的 package and activity name 组合:com.android.gallery3d/.app.GalleryActivity

套用到 am 命令中就是:

am start -n com.android.gallery3d/.app.GalleryActivity --display 3