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