6

我的 VOIP Android 应用程序具有 C/Native 库,它执行登录/注销等所有业务逻辑。

问题是当设备屏幕被锁定时,应用程序(c 代码)无法从服务器接收任何数据包。我用 Wireshark 验证了这一点。看起来 CPU 没有运行。

我能够在我的应用程序 INIT 上解决以下问题。

WakeLock mWakeLock =  null;
PowerManager pm = (PowerManager) cxt.getSystemService(Context.POWER_SERVICE);
if(mPartialWakeLock == null){
    // lock used to keep the processor awake.
    mPartialWakeLock = pm.newWakeLock(
        PowerManager.PARTIAL_WAKE_LOCK
            | PowerManager.ON_AFTER_RELEASE, TAG);
    mPartialWakeLock.acquire;
}

但这样做会耗尽我的电池。

为什么请求没有到达我的应用程序?当屏幕被锁定并接收来自服务器的请求时,如何让设备 CPU 一直处于启动状态?

注意:使用的已编辑设备:Samsung Rugby Smart i847 操作系统:Android 操作系统,v2.3.6 (Gingerbread.UCLA4)

该应用程序在 Galaxy s2 上运行。(是因为它的双核处理器和 CPU 处于屏幕锁定状态?) SKYPE 和 VIBER 如何将 WRT 设计为睡眠模式?

4

5 回答 5

1

我正在开发一个类似的应用程序,该应用程序运行一个服务,该服务在启动时与服务器建立持久的 TCP 连接,以便能够从服务器接收消息。该服务不获取任何锁。应用程序的这一部分已经实现了一段时间,到目前为止,我还没有遇到任何无法从服务器接收消息的问题。在阅读了您的问题后,我决定测试为什么我没有遇到这个问题。

我想,即使我没有持有任何锁,也许还有其他应用程序持有,因此可以让 CPU 保持活动状态。运行adb shell dumpsys时,我注意到情况并非如此:mLocks.size=0.

这一定意味着应用程序仍然能够接收数据包,即使设备处于睡眠状态。我找不到任何官方信息,但互联网上的一些帖子似乎同意:

虽然我还没有找到一个很好的例子来说明这一点,但似乎即使您的手机处于睡眠状态,如果在连接上接收到数据,您的代码也会被唤醒 [...] (来源)


> 假设设备处于深度睡眠并且网络堆栈接收到传入数据包。这会唤醒设备吗?

它应该。(来源

但是,请注意,这两个来源都建议您应该获取唤醒锁来处理数据包,以防止设备在此处理过程中进入睡眠状态。我在我的申请中没有这样做(也许我应该这样做),但我的处理时间真的很短。

当您说您的请求没有到达您的应用程序时,您确定它们没有到达吗?也许他们是,但是您的应用程序在发送回复之前就睡着了?尝试在套接字上接收数据时获取唤醒锁,并在完成处理后释放它。

于 2012-07-05T11:19:36.617 回答
1

你考虑过使用服务吗?

服务为应用程序提供了一种工具,可以告诉系统它想要在后台执行的操作(即使用户没有直接与应用程序交互)。通过启动它,系统将为服务安排工作,直到服务或其他人明确停止它为止。

我想这可以帮助..干杯

编辑: Oki,你之前没有提到服务..我仍然不确定你是否有两个问题(耗尽电池和没有接收数据)或者只是一个你接收数据的问题......?

考虑到电池耗尽,您可以尝试使用不同的WAKE_LOCK标志。

我注意到的重要一点是,您没有按照链接的 WAKE_LOCK页面上的建议释放锁定:mPartialWakeLock.release()

使用此 API 将显着影响设备电池寿命。除非您真的需要,否则不要获取 WakeLock,尽可能使用最低级别,并确保尽快释放它。

此外,根据其他一些帖子,电池消耗速度取决于您在服务中所做事情的工作和有效性,所以这是我们在没有看到更多代码的情况下无法提供帮助的地方......:S

顺便说一句..恕我直言,如果你只是等待来电并且你一直保持 WAKE_LOCK,这可能是电池耗电高的原因。想想你需要什么,如果你不需要,尽量减少资源的使用他们..以 WIFI_LOCK 为例,并尽快释放 WAKE_LOCK..

于 2012-07-05T06:41:48.377 回答
0

No need for using the wakelocks, as they are unreliable and buggy.

It would be more efficient to use the system's own version of keeping the screen on in a manageable way that is taken care of by Android:

Within the onCreate in your activity, do this:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
                     WindowManager.FLAG_SHOW_WHEN_LOCKED);

This is from the developer's API found here:

public static final int FLAG_SHOW_WHEN_LOCKED

Since: API Level 5 Window flag: special flag to let windows be shown when the screen is locked. This will let application windows take precedence over key guard or any other lock screens. Can be used with FLAG_KEEP_SCREEN_ON to turn screen on and display windows directly before showing the key guard window. Can be used with FLAG_DISMISS_KEYGUARD to automatically fully dismisss non-secure keyguards. This flag only applies to the top-most full-screen window.

Constant Value: 524288 (0x00080000)

By combining it with the efficient screen on flag, should get around the screen-lock facility. The only thing is to make sure that your activity is the top-most on screen.

To quote, on the usage of FLAG_KEEP_SCREEN_ON of PowerManager

public static final int SCREEN_BRIGHT_WAKE_LOCK

This constant is deprecated. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission. Wake lock that ensures that the screen is on at full brightness; the keyboard backlight will be allowed to go off.

于 2012-07-11T01:21:38.723 回答
0

当您的应用程序在后台运行时,无法接收 UDP 数据。因为您的客户端正在以多播的形式发送数据。当您的移动设备屏幕锁定并且应用程序在后台运行时,在这种情况下,移动硬件有 mac 过滤器和 ip 过滤器,它们只能接受指向属于设备的特定 IP 的数据。简单来说就是你需要做单播。例如:有客户端在特定套接字和 ip 上发送数据(在您的情况下,您可能在 255.255.255.255 上发送数据)并且如果有任何设备准备好在该端口上接收数据,则您的数据将在特定端口上广播它就像一个服务器,例如您的应用程序就像一个服务器,如果您的应用程序在前台运行,它会接收数据。并且当您在后台应用程序时应用程序不会。

因此,您要做的就是获取设备 IP 地址,并且必须在设备 IP 地址上发送数据,这意味着您将进行单播。在这种情况下,您的应用程序将接收运行在后台或前台的数据,并且您的手机屏幕被锁定。

于 2015-09-09T08:52:21.020 回答
-1

没有必要创建这样不起作用的代码——为什么不使用现成的软件呢?我们使用 Ozeki Phone System XE PBX 和 Android 手机(有 30 部 Android 手机通过 VoIP 连接到系统),它们可以正常工作。

看看这个:链接

RTCP 协议处理从来没有问题。如果需要,请尝试试用版。

希望我能帮上忙。

于 2012-10-11T09:41:00.730 回答