我有一个我编写的 SL4A 程序。在我准备发布之前,我有一个问题。
由于某种原因,当应用程序运行时,如果我在应用程序之外的主屏幕,我看到它在通知区域中运行,但是当我选择它时没有任何反应。但是,如果我从应用程序区域单击我的图标,它将重新启动应用程序。
有什么建议么?
好吧,您似乎可以使用以下命令看到由 SL4A "como.googlecode.android_scripting" 包启动的通知:
这更像是一个黑客。
dumpsys statusbar | grep "pkg=com.googlecode.android_scripting"
SL4A 发起的每个通知都会有一个“id”。例如,“id=1”是 SL4A 在服务器运行时启动的通知。您单击以停止服务器的那个。
考虑到这一点,您实际上可以列出由您的包启动的每个通知并阻止,直到您的通知的 id 消失。
如果是这样,那么您的下一个通知应该有一个 2 或更高的 id。请注意,如果 SL4A 停止或崩溃,这可能会发生变化。下次您可能会收到(RPC)服务器通知的“id=2”,然后您的应用程序通知会收到“id=3”,直到您重新启动设备,因此 RPC 服务器通知会返回到“id=1” ”。知道这一点意味着您需要在循环中不断搜索新通知。
例如在 bash 中并使用 adb:
while read Info; do echo "$Info" | grep 'pkg=com.googlecode.android_scripting'; done < <(adb shell dumpsys statusbar)
你会得到这样的东西:
1: StatusBarNotification(pkg=com.googlecode.android_scripting id=2 tag=null score=0 notn=Notification(pri=0 contentView=com.googlecode.android_scripting/0x109008f vibrate=null sound=null defaults=0x0 flags=0x62 kind= [null]) user=UserHandle{0}) # SL4A RPC 通知
7: StatusBarNotification(pkg=com.googlecode.android_scripting id=3 tag=null score=0 notn=Notification(pri=0 contentView=com.googlecode.android_scripting/0x109008f vibrate=null sound=null defaults=0x0 flags=0x10 kind= [null]) user=UserHandle{0}) # 我的通知
让我们玩这个!
跑步:
while read Info; do echo "$Info" | grep "pkg=com.googlecode.android_scripting" | awk '{print $3}' | cut -s -d '=' -f2 ; done < <(adb shell dumpsys statusbar)
例如,将为您提供:
# Without Using Cut
id=2 # SL4A Notificaion
id=3 # My Notification
或者:
# Using Cut
2 # SL4A Notification
3 # My Notification
让我们开始行动吧!(一个丑陋的解决方案)
# Start ADB USB Serial Connection
adb devices
# Activate Wireless ADB (Needs Root) - Not Needed
# adb shell setprop service.adb.tcp.port 5555
# stop adbd
# start adbd
或者:
# Start ADB Wireless
adb connect 192.168.1.3
NotifyCount=0
NotifyList=()
while read Notify; do
DumpNotify=`echo "$Notify" | grep "pkg=com.googlecode.android_scripting" | awk '{print $3}' | cut -s -d '=' -f2`
if [ ! -z "$DumpNotify" ] ; then
NotifyList[$NotifyCount]="$DumpNotify"
((NotifyCount++))
fi
done < <(adb shell dumpsys statusbar)
SL4ARPCNotification="2"
MyScriptNotification="3"
if [[ ${NotifyList[*]} != *"$MyScriptNotification"* ]] ; then
adb shell am start -a android.intent.action.MUSIC_PLAYER
fi
这在 2 个带有 MyNotification 和 SL4ARPCNotification 变量参数的函数中应该会更好。这样,您可以从代码中的任何位置进行验证并划分工作:FunctionX 用于列出通知,FunctionY 用于比较结果。
这可以在 Pyhon 或其他解释器中轻松完成。您需要记住,总是有来自 SL4A 本身的通知。通过在 python 中使用线程,您可以连续搜索新的或旧的通知,而无需阻止程序等待更改,因此您可以继续正常运行脚本。
SL4A 创建的通知什么也不做;他们没有回调,只能提醒用户。不幸的是,实际上并没有任何办法解决这个问题:BeanShell、JRuby 和 Rhino 可以进行 Java API 调用(例如,添加“单击时打开我的应用程序”部分)但不能使用Context
s(通知需要),并且您可以制作自己的 API 外观版本,但随后用户需要为 Android 安装您的特定版本的 x(例如 Python)。
否则我能想到的就是用Intent
s 或其他东西变得棘手,并在/src
你的应用程序中包含一个活动来显示通知,尽管这可能需要学习 Java / Android 编程,这意味着你最好遵循并编写整个本机应用程序。
抱歉,但确实没有简单的方法可以做到这一点
你说你想发布它,所以我假设你暗示从长远来看你会将它编译成一个独立的 apk?
如果是这样,您将使用/将使用哪个软件包?py4a的方法,python27,kivy?根据我在使用 python27 编译为 apk 时的经验,顶部根本没有通知窗口,但如果您使用 py4a 的方法编译它,它应该为您创建一个可行的通知项。请参阅以下链接了解更多信息:http ://code.google.com/p/android-scripting/wiki/SharingScripts
否则 ProfSmiles 的答案是正确的,但它似乎是一个比使用 py4a 方法更复杂的解决方案。
如果您想要一种更嵌入式的方法,您也可以查看 python27 项目,尽管如前所述,它没有像 py4a 那样的默认通知设置。
Kivy 的实现看起来也很有希望,但我不熟悉它,它可能还值得进一步研究:https ://github.com/kivy/python-for-android