Android 服务重启多次
Android Service restarting multiple times
当我在 phone 上启动应用程序时,服务的 onCreate 在不到一秒内被调用了 3-4 次。
另一方面,oncreate 设置为启动一个派生的线程 class,该线程在 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的函数class
public String GetOwnIPAddress()
{
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
您的服务架构有误。
OnCreate 不应启动线程。任何类似的事情都应该在 onStartCommand 或以后完成。创建您的服务并不意味着它的 运行,这就是 onStartCommand 的意思。您的服务可能会根据系统的意愿创建或终止,onCreate 应该做一个最小的负担。
附带说明 - 永远不要像使用 TheService=this 那样将您的服务用作单例。它会让您陷入各种麻烦,例如查询已停止的服务。如果您需要调用服务上的函数,请绑定到它并 return onBind 中的 Binder 访问您的 API。你这样做会导致内存泄漏和崩溃。
当我在 phone 上启动应用程序时,服务的 onCreate 在不到一秒内被调用了 3-4 次。
另一方面,oncreate 设置为启动一个派生的线程 class,该线程在 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的函数class
public String GetOwnIPAddress()
{
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
您的服务架构有误。
OnCreate 不应启动线程。任何类似的事情都应该在 onStartCommand 或以后完成。创建您的服务并不意味着它的 运行,这就是 onStartCommand 的意思。您的服务可能会根据系统的意愿创建或终止,onCreate 应该做一个最小的负担。
附带说明 - 永远不要像使用 TheService=this 那样将您的服务用作单例。它会让您陷入各种麻烦,例如查询已停止的服务。如果您需要调用服务上的函数,请绑定到它并 return onBind 中的 Binder 访问您的 API。你这样做会导致内存泄漏和崩溃。