手机锁屏的断网奇怪问题!

编程有钱人了 2016-12-20 11:51:33

package com.example.socketdemo;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Looper;
import android.os.Message;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
import java.util.logging.Handler;

public class MainActivity extends Activity {

TextView textmsg;
Button btnsend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textmsg=(TextView)this.findViewById(R.id.textMessage);
btnsend=(Button)this.findViewById(R.id.buttonSend);
btnsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(runchannel).start();
}
});

}

Runnable runchannel = new Runnable(){
@Override
public void run() {
while (true)
{
try {
if(HaveInternet())
{
Log.i("MainActivity", "处在联网状态");
}
else
{
Log.i("MainActivity", "没网了");
}
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}

}
};
public boolean HaveInternet()
{
ConnectivityManager manger = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manger.getActiveNetworkInfo();
return (info!=null && info.isConnected());
}
}

运行这段代码,手机锁屏大约3分钟后 检测到断网了。输出 Log.i("MainActivity", "没网了");
但是这时候QQ,微信还能收到消息。。。。这是为什么?
自己的socket居然也是断网了!太奇怪了,求大神解决!

 BroadcastReceiver connectionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
Log.i("Live", "断网了");
onChannelClose();
try {
nclient.ChannelClose();
} catch (IOException e) {
e.printStackTrace();
}
channelHandler.removeCallbacks(runchannel);
}else {
Log.i("Live", "来网了");
}
}
};

手机开屏也能检测到广播通知( Log.i("Live", "来网了")) 如果真断网了,为什么QQ,微信等APP还能收到消息??
...全文
739 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
沐風聽雨 2021-01-13
  • 打赏
  • 举报
回复
楼主后来解决没这个问题?我最近也被这个问题困扰着
编程有钱人了 2017-01-18
  • 打赏
  • 举报
回复
引用 14 楼 duanchuanzhi 的回复:
QQ和微信都可以收到消息 那样不就是你广播错了吗
好好代码,我没用广播,回帖之前自己请测试下
developerzjy 2017-01-17
  • 打赏
  • 举报
回复
引用 9 楼 wangjun8868 的回复:
[quote=引用 7 楼 Simple_Simple_Simple 的回复:] [quote=引用 6 楼 wangjun8868 的回复:] [quote=引用 5 楼 Simple_Simple_Simple 的回复:] QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
是空[/quote] 那就不一定是断网了,应该找info是空的原因[/quote] 这几天一直研究这个问题,现在测试的是小米4C手机, 我把这个应用设置 锁定任务后,就一直能联网,即时锁屏半个小时都没问题。 [/quote] 我觉得跟锁屏的时候有没有权限无关,因为你不是锁屏之后马上打印出没网的,是过了几分钟之后才没网的,所以即使锁屏了应该也是有权限的。会不会跟android的内存回收机制有关,锁屏之后你的activity过一段时间被回收了,但是打印log那个线程还在执行,所以info是空了,可以试试在生命周期的ondestory方法里面打印一个log看看,然后按照你最初复现问题的步骤试一下,看看是不是activity被回收了导致info是空的
丿末兮 2017-01-17
  • 打赏
  • 举报
回复
QQ和微信都可以收到消息 那样不就是你广播错了吗
developerzjy 2017-01-17
  • 打赏
  • 举报
回复
引用 12 楼 wangjun8868 的回复:
[quote=引用 11 楼 Simple_Simple_Simple 的回复:] [quote=引用 9 楼 wangjun8868 的回复:] [quote=引用 7 楼 Simple_Simple_Simple 的回复:] [quote=引用 6 楼 wangjun8868 的回复:] [quote=引用 5 楼 Simple_Simple_Simple 的回复:] QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
是空[/quote] 那就不一定是断网了,应该找info是空的原因[/quote] 这几天一直研究这个问题,现在测试的是小米4C手机, 我把这个应用设置 锁定任务后,就一直能联网,即时锁屏半个小时都没问题。 [/quote] 我觉得跟锁屏的时候有没有权限无关,因为你不是锁屏之后马上打印出没网的,是过了几分钟之后才没网的,所以即使锁屏了应该也是有权限的。会不会跟android的内存回收机制有关,锁屏之后你的activity过一段时间被回收了,但是打印log那个线程还在执行,所以info是空了,可以试试在生命周期的ondestory方法里面打印一个log看看,然后按照你最初复现问题的步骤试一下,看看是不是activity被回收了导致info是空的[/quote] 上面的是测试代码,实际上我这段代码是写在Service里面,退一步讲 即使activity回收了,线程却在一直执行,说明activity没被回收[/quote] 因为你锁定任务后就没问题了,所以我会有上面说的那些猜测 而且Service优先级好像更低更容易被回收(没记错的话是这样),你可以网上搜索一下让Service不被回收的方法,然后不锁定任务看看能不能复现断网 另外,自己new Thread的线程执行,不能说明activity没被回收,你可以手动按返回键退出activity,这样activity被销毁线程里面的log会继续打,你可以试一下。(这个我可以肯定) 如果activity被回收,getSystemService(Context.CONNECTIVITY_SERVICE) 是activity的方法,当然就不会正常执行(这个只是猜测,可能不对)
编程有钱人了 2017-01-17
  • 打赏
  • 举报
回复
引用 11 楼 Simple_Simple_Simple 的回复:
[quote=引用 9 楼 wangjun8868 的回复:] [quote=引用 7 楼 Simple_Simple_Simple 的回复:] [quote=引用 6 楼 wangjun8868 的回复:] [quote=引用 5 楼 Simple_Simple_Simple 的回复:] QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
是空[/quote] 那就不一定是断网了,应该找info是空的原因[/quote] 这几天一直研究这个问题,现在测试的是小米4C手机, 我把这个应用设置 锁定任务后,就一直能联网,即时锁屏半个小时都没问题。 [/quote] 我觉得跟锁屏的时候有没有权限无关,因为你不是锁屏之后马上打印出没网的,是过了几分钟之后才没网的,所以即使锁屏了应该也是有权限的。会不会跟android的内存回收机制有关,锁屏之后你的activity过一段时间被回收了,但是打印log那个线程还在执行,所以info是空了,可以试试在生命周期的ondestory方法里面打印一个log看看,然后按照你最初复现问题的步骤试一下,看看是不是activity被回收了导致info是空的[/quote] 上面的是测试代码,实际上我这段代码是写在Service里面,退一步讲 即使activity回收了,线程却在一直执行,说明activity没被回收
编程有钱人了 2017-01-16
  • 打赏
  • 举报
回复
引用 8 楼 Arnold9009 的回复:
微信等应用一般都是注册成了系统的核心应用,所以锁屏的时候有权限使用一些资源
我同意你的这个观点.
编程有钱人了 2017-01-16
  • 打赏
  • 举报
回复
引用 7 楼 Simple_Simple_Simple 的回复:
[quote=引用 6 楼 wangjun8868 的回复:]
[quote=引用 5 楼 Simple_Simple_Simple 的回复:]
QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空

是空[/quote]

那就不一定是断网了,应该找info是空的原因[/quote]
这几天一直研究这个问题,现在测试的是小米4C手机,
我把这个应用设置 锁定任务后,就一直能联网,即时锁屏半个小时都没问题。

Arnold9009 2017-01-15
  • 打赏
  • 举报
回复
微信等应用一般都是注册成了系统的核心应用,所以锁屏的时候有权限使用一些资源
developerzjy 2017-01-15
  • 打赏
  • 举报
回复
引用 6 楼 wangjun8868 的回复:
[quote=引用 5 楼 Simple_Simple_Simple 的回复:] QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
是空[/quote] 那就不一定是断网了,应该找info是空的原因
编程有钱人了 2017-01-14
  • 打赏
  • 举报
回复
引用 5 楼 Simple_Simple_Simple 的回复:
QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
是空
developerzjy 2016-12-22
  • 打赏
  • 举报
回复
QQ,微信都能联网,应该是网络没有断,输出断网log的时候也可以看看通知栏那里有没有wifi或者移动网络显示连接的图标,确定网络没断的话就是你代码的问题了,可以看看你代码 return (info!=null && info.isConnected()); 这里面的info是否是空
编程有钱人了 2016-12-22
  • 打赏
  • 举报
回复
引用 3 楼 zhumj_zhumj 的回复:
可能是因为开启了省电节能模式
没有开启,QQ,微信都能联网
头发还没秃a 2016-12-21
  • 打赏
  • 举报
回复
可能是因为开启了省电节能模式
飞鱼先生 2016-12-20
  • 打赏
  • 举报
回复
还真没遇到过。
编程有钱人了 2016-12-20
  • 打赏
  • 举报
回复
没有人遇到这样的问题 吗?

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧