Android shell获取前台应用程序包名称

时间:2015-02-16 14:37:18

标签: android shell adb

我正在使用tasker自动发送SMS,我需要检查当前前台应用程序包名称是否为x。如果它是x,那么做别的事情。我尝试使用pgrep,但即使app x在后台,它也会返回pid。有没有办法从shell检查x是否在前景? 感谢

2 个答案:

答案 0 :(得分:9)

这对我有用。请注意,为了使其正常工作,您应该安装busybox并将rev作为当前路径上busybox的符号链接:

dumpsys window windows | grep mCurrentFocus | cut -d'/' -f1 | rev | cut -d' ' -f1 | rev
  

com.facebook.katana

答案 1 :(得分:2)

在许多情况下,接受的答案可能会产生意外结果。

某些UI元素(例如,对话框)不会在mCurrentFocus(mFocusedApp)字段上显示包名称。例如,当应用程序抛出对话框时,mCurrentFocus通常是对话框的标题。一些应用程序在应用程序启动时显示这些内容,使得此方法无法检测应用程序是否已成功引入前台。

例如,应用com.imo.android.imoimbeta会在开始时询问用户所在国家/地区,其当前焦点是:

$ adb shell dumpsys window windows | grep mCurrentFocus
  mCurrentFocus=Window{21e4cca8 u0 Choose a country}

在这种情况下mFocusedApp为空,因此了解哪个应用包名称来自此对话框的唯一方法是检查其mOwnerUID

Window #3 Window{21d12418 u0 Choose a country}:
    mDisplayId=0 mSession=Session{21cb88b8 5876:u0a10071} mClient=android.os.BinderProxy@21c32160
    mOwnerUid=10071 mShowToOwnerOnly=true package=com.imo.android.imoimbeta appop=NONE 

根据用例,接受的解决方案可能就足够了,但值得一提的是它的局限性。

我发现到目前为止工作的解决方案:

window_output = %x(adb shell dumpsys window windows)
windows = Hash.new
app_window = nil

window_output.each_line do |line| 

    case line

      #matches the mCurrentFocus, so we can check the actual owner
      when /Window #\d+[^{]+({[^}]+})/ #New window
        app_window=$1 

      #owner of the current window
      when /mOwnerUid=[\d]+\s[^\s]+\spackage=([^\s]+)/ 
        app_package=$1

        #Lets store the respective app_package
        windows[app_window] = app_package

      when /mCurrentFocus=[^{]+({[^}]+})/
        app_focus=$1

        puts "Current Focus package name: #{windows[app_focus]}"

        break
    end
end