【问题标题】:Android Service restarting multiple timesAndroid服务多次重启
【发布时间】:2016-12-05 04:47:58
【问题描述】:

当我在手机上启动应用程序时,服务的 onCreate 在不到一秒的时间内被调用了 3-4 次。

另一方面,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;

    }

【问题讨论】:

    标签: java android networking ip-address


    【解决方案1】:

    您的服务架构错误。

    OnCreate 不应该启动线程。任何类似的事情都应该在 onStartCommand 或更高版本中完成。创建您的服务并不意味着它正在运行,这就是 onStartCommand 的含义。您的服务可能会根据系统的意愿创建或终止,onCreate 应该做的最少。

    附带说明 - 永远不要像使用 TheService=this 那样将您的服务用作单身人士。它会让你陷入各种麻烦,例如查询已停止的服务。如果您需要调用服务上的函数,请绑定到它并在 onBind 中返回一个访问您的 API 的 Binder。您正在做的事情会导致内存泄漏和崩溃。

    【讨论】:

    • 感谢将东西移到 onStartCommand 工作,但是线程打印的地址现在卡在 127.0.0.1 的环回地址,但这应该是它自己的问题
    • 嗯,这实际上并没有错——本地主机的 IP 是 127.0.0.1 :) 请参阅stackoverflow.com/questions/6064510/… 了解其他获取方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2014-01-21
    • 2021-10-05
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多