80,479
社区成员
发帖
与我相关
我的任务
分享
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());
}
}
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", "来网了");
}
}
};
[/quote]
我觉得跟锁屏的时候有没有权限无关,因为你不是锁屏之后马上打印出没网的,是过了几分钟之后才没网的,所以即使锁屏了应该也是有权限的。会不会跟android的内存回收机制有关,锁屏之后你的activity过一段时间被回收了,但是打印log那个线程还在执行,所以info是空了,可以试试在生命周期的ondestory方法里面打印一个log看看,然后按照你最初复现问题的步骤试一下,看看是不是activity被回收了导致info是空的
[/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的方法,当然就不会正常执行(这个只是猜测,可能不对)
[/quote]
我觉得跟锁屏的时候有没有权限无关,因为你不是锁屏之后马上打印出没网的,是过了几分钟之后才没网的,所以即使锁屏了应该也是有权限的。会不会跟android的内存回收机制有关,锁屏之后你的activity过一段时间被回收了,但是打印log那个线程还在执行,所以info是空了,可以试试在生命周期的ondestory方法里面打印一个log看看,然后按照你最初复现问题的步骤试一下,看看是不是activity被回收了导致info是空的[/quote]
上面的是测试代码,实际上我这段代码是写在Service里面,退一步讲 即使activity回收了,线程却在一直执行,说明activity没被回收