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

时间:2012-08-29 00:57:27

标签: android sl4a

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

由于某些原因,当应用程序运行时,如果我将主屏幕移出应用程序,我会看到它在通知区域中运行,但是当我选择它时没有任何反应。但是,如果我从应用程序区域单击我的图标,它将重新启动应用程序。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

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

否则,我所能想到的就是使用Intent或其他东西变得棘手,并在应用的/src中添加一个活动来显示通知,尽管这可能需要学习Java / Android编程意味着您可以在本地跟进并编写整个应用程序。

抱歉,但确实没有一种简单的方法可以做到这一点

答案 1 :(得分:0)

你说你想发布它所以我假设你暗示从长远来看你会把它编译成一个独立的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

答案 2 :(得分:0)

好吧,您似乎可以看到SL4A" como.googlecode.android_scripting"使用以下命令打包:

这更像是一个黑客。

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

SL4A发起的每个通知都会有一个" id"。例如" id = 1"是服务器运行时由SL4A启动的通知。单击以停止服务器的那个。

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

如果是,那么您的下一个通知应该具有2或更高的ID。请注意,如果SL4A停止或崩溃,这可能会发生变化。下次你可以得到" id = 2" (RPC)服务器通知然后" 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

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

这可以在Pyhon或其他口译员中轻松完成。您需要记住,SL4A本身始终会发出通知。通过在python中使用Threading,您可以连续搜索新的或旧的通知,而无需阻止程序等待更改,因此您可以继续正常运行脚本。