【问题标题】:Java Android socket gets killed imidiatelly after screen goes blank屏幕空白后Java Android套接字立即被杀死
【发布时间】:2017-10-04 06:10:39
【问题描述】:

我用一个socket来连接服务器:

Socket requestSocket.connect(new InetSocketAddress(a, 6666), 3000);

它一直运行良好,除非设备长时间处于空闲模式,例如 30 分钟左右。 30 分钟后,如果我让设备进入唤醒状态,并尝试通过我的应用程序联系服务器,它不会引发任何异常。这表明我的套接字连接仍处于活动状态。但是当我在服务器端检查时,这里没有收到相同的数据。

【问题讨论】:

  • 请问您能上传您的异常日志吗?
  • 在您编写此连接代码的位置。我想你只写在 onCreate 里面
  • @Tej 我创建了一个新线程并在此线程上设置连接
  • @redAllocator 我没有例外。当我用电脑连接设备时一切正常
  • @KrzysztofPokrywka 您的线程可能已暂停,请在 OnResume 中检查您的线程是否正在运行。如果没有,请重新开始。

标签: java android sockets


【解决方案1】:

电池方式是通过startForground使用后台服务

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    onHandleIntent(intent);
    return START_STICKY;
}


protected void onHandleIntent(Intent intent) {
    if (intent != null) {
        Notification.Builder builder = new Notification.Builder(getBaseContext())
                .setContentTitle("")
                .setContentText("Your content text");
        startForeground(1, builder.build());
        Socket requestSocket.connect(new InetSocketAddress(a, 6666), 3000);
    }

}

即使您的应用已关闭或从最近的应用中删除,此服务也永远不会暂停/关闭您的套接字连接。

如果你想从后台服务更新 UI,你可以从 UI 使用绑定服务

@Override
    public IBinder onBind(Intent intent) {
        if (TweetCollectorService.class.getName().equals(intent.getAction())) {
            Log.d(TAG, "Bound by intent " + intent);
            return apiEndpoint;
        } else {
            return null;
        }
    }

【讨论】:

  • 好的,但是这个服务什么时候被杀死?
  • 何时杀死它取决于你。你可以使用 stopSelf() 函数杀死它
  • 所以当我关闭应用程序时服务停止了?
  • 不杀就不行
  • 那么我怎么能杀死这个服务呢?
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2021-06-07
  • 2010-11-09
  • 2023-04-01
  • 2019-08-18
  • 1970-01-01
  • 2014-11-19
  • 2012-05-06
相关资源
最近更新 更多