Android服务重新启动多次
问题描述:
当我在手机上启动应用程序时,服务的onCreate在不到一秒内被调用3-4次。Android服务重新启动多次
另一方面,oncreate被设置为启动一个线程派生类,该类可以在logcat上打印设备的网络IP。
古怪每次调用OnCreate中随机给出任何实际的IP(192.168.1.xxx)或回送(127.0.0.1)
@Override
public void onCreate() {
super.onCreate();
TheService=this;
chargingState = GetChargingState();
if(mainActivity!=null)
mainActivity.UpdateDisplay(chargingState);
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(new ChargingStateListener(),ifilter);
new NetworkHandler().findServer();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
函数获取IP的线程类
public String GetOwnIPAddress()
{
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
答
您正在对您的服务进行misarchitecture。
OnCreate永远不应该启动一个线程。任何这样的事情都应该在onStartCommand或更高版本中完成。创建您的服务并不意味着它的运行,这就是onStartCommand的含义。您的服务可能会根据系统的意愿而创建或中止,onCreate应该尽量减少。
在旁边注意 - 不要像使用TheService = this一样将您的服务用作单例。它会让你陷入各种麻烦,比如查询停止的服务。如果您需要调用服务上的函数,请绑定到它并在onBind中返回一个访问您的API的Binder。你在做什么会导致内存泄漏和崩溃。
感谢移动东西到onStartCommand工作,但由线程打印的地址现在卡在环回地址127.0.0.1,但这应该是它自己的问题 – Allahjane
嗯,这实际上并不错 - 本地主机的IP是127.0.0.1 :)请参阅http://*.com/questions/6064510/how-to-get-ip-address-of-the-device获取它的其他方式 –