繁体   English   中英

Sl4A从通知窗口中选择正在运行的应用程序

[英]Sl4A Selecting running application from notification window

我有一个编写的SL4A程序。 在准备发布之前,我有一个问题。

由于某种原因,当应用程序运行时,如果我不在该应用程序的主屏幕上,则会看到它在通知区域中运行,但是当我选择它时,什么也没有发生。 但是,如果我从应用程序区域单击我的图标,它将使该应用程序重新启动。

有什么建议么?

SL4A创建的通知没有任何作用; 他们没有回调,只能提醒用户。 不幸的是,实际上并没有解决的办法:BeanShell,JRuby和Rhino可以进行Java API调用(例如,添加“单击时打开我的应用程序”部分),但不能使用Context (通知要求),您可以制作自己的API门面版本,但随后需要用户安装适用于Android的特定版本的x(例如Python)。

否则,我能想到的就是弄乱Intent或其他东西,并在应用程序的/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

好吧,看来您可以使用以下命令查看由SL4A“ como.googlecode.android_scripting”软件包启动的通知:

这更像是骇客。

dumpsys statusbar | grep "pkg=com.googlecode.android_scripting"

SL4A发起的每个通知都将带有一个“ id”。 例如,“ id = 1”是SL4A在服务器运行时启动的通知。 您单击以停止服务器的服务器。

考虑到这一点,您实际上可以列出由软件包启动的每个通知,并阻止直到通知的ID消失。

如果是这样,那么您的下一个通知的ID应该为2或更大。 请注意,如果SL4A停止或崩溃,这可以更改。 下次您可能会收到(RPC)服务器通知的“ id = 2”,然后是您的应用程序通知的“ id = 3”及以上,直到您重新启动设备为止,因此RPC服务器通知会回到“ id = 1” ”。 知道这一点意味着您需要在循环中保留searchig以查找新的通知。

例如在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

在带有MyNotification和SL4ARPCNotification变量参数的2个函数中,这应该更好。 这样,您可以在代码中的任何位置进行验证并划分工作:FunctionX用于列出通知,而FunctionY用于比较结果。

这可以在Pyhon或其他口译员中轻松完成。 您需要记住,SL4A本身总是会发出通知。 通过使用Python线程,你可以为新的或旧的通知不断地搜索,而不需要阻止你的程序等待一个变化,因此你可以继续正常runninig脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM