屏幕关闭时Android会丢弃tcp连接

时间:2014-02-24 20:07:42

标签: android tcp xamarin

我的Android应用启动并在前台服务中保持TCP连接。该活动使用StartService()来启动该服务。该服务也是在它自己的流程中启动的。

以下是服务OnStartCommand

// Code is in C# using Xamarin but regular Java/Android answers are acceptable
public override StartCommandResult OnStartCommand (Intent intent, StartCommandFlags flags, int startId)
{
    base.OnStartCommand (intent, flags, startId);

    ...

    var ongoingNotification = new Notification (Resource.Drawable.icon, "Service running");
    var pendingIntent = PendingIntent.GetActivity (this, 0, new Intent (this, typeof(MainActivity)), 0);
    ongoingNotification.SetLatestEventInfo (this, "Service", "The service is running.", pendingIntent);
    StartForeground ((int)NotificationFlags.ForegroundService, ongoingNotification);
    return StartCommandResult.RedeliverIntent;
}

当手机屏幕开启时,无论我的应用程序中的活动是否打开,连接都可以。然而,在我关闭屏幕后不到30秒,我总是失去tcp连接。我的应用程序自动重新连接,因此我恢复了连接,但是当屏幕关闭时它会不断断开连接。我把它重新打开并且很好,即使我的应用程序中的某个活动没有打开。

它可以连接到Android生命周期,但我只是不知道如何。基于调试消息,我写入手机上的文本文件(当连接IDE的调试器时,问题不会发生),该服务似乎按照预期运行但连接不稳定。

我也在选择开发人员选项中的“不要保持活动”时进行了测试,但没有更改。所以它至少与Activity Lifecycle没有任何关系。

为什么Android会丢弃我的tcp连接,但只有在屏幕关闭时?

1 个答案:

答案 0 :(得分:1)

我通过在服务运行时获取部分WakeLock来解决问题。

private PowerManager.WakeLock mWakeLock;

public override void OnCreate ()
{
    PowerManager pm = (PowerManager) GetSystemService(Context.PowerService);
    mWakeLock = pm.NewWakeLock (WakeLockFlags.Partial, "PartialWakeLockTag");
    mWakeLock.Acquire();
}

public override void OnDestroy ()
{
    mWakeLock.Release();
}

如果我将来实施更节能的功能,我会更新这个答案。