我的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连接,但只有在屏幕关闭时?
答案 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();
}
如果我将来实施更节能的功能,我会更新这个答案。