android 的服务生命周期

service lifecycle on android

我创建了一个服务,然后在 main 上启动它 activity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    startService(new Intent(this, MQTTservice.class));
}

在我的服务 class 中,我在 onCreate() 方法中记录了它:

public void onCreate() {
    super.onCreate();
    Log.i(TAG, "onCreate: 1");
    connection = new MqttConnection();
}

如您在此方法中所见,我创建了 MqttConnection class 的新实例,该实例从 Thread class.in MqttConnection 的构造函数 class 扩展而来,我再次登录:

public MqttConnection() {
    Log.i("==>", "constructor MqttConnection: service");
    // create a handler
    msgHandler = new MsgHandler();
    msgHandler.sendMessage(Message.obtain(null,CONNECT));
}

如您在此方法中所见,我创建了 MsgHandler class 的新实例,该实例从 Handler class.in MsgHandler class 的构造函数扩展而来,我再次记录 :

MsgHandler() {
    Log.i("==>", "MsgHandler: constructor");
}

并在 MsgHandler 上的 handleMessage 中 class:

public void handleMessage(Message msg) {
    super.handleMessage(msg);
    Log.i("==>", "handleMessage: MsgHandler"+ msg.what);
}

我像这样覆盖我的服务的 onStartCommand 方法:

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand: service");

    super.onStartCommand(intent, flags, startId);

    // Start the MQTT Thread.
    connection.start();
    return START_STICKY;
}

并记录 it.as 你可以看到我已经启动了我的线程 (MqttConnection() class)。当我 运行 这段代码时,我刚得到这个日志:

onCreate: 1
onStartCommand: service

为什么我的其他日志没有出现?

尝试在 MqttConnection 中使用 isRunning:

class MqttConnection extends Thread {
    private boolean running;
    private MsgHandler msgHandler;

    MqttConnection() {
        Log.e("==>", "constructor MqttConnection: service");
        // create a handler
        msgHandler = new MsgHandler();
        msgHandler.sendMessage(Message.obtain(null, 1));
        running = false;
    }

    public boolean isRunning() {
        return running;
    }

    @Override
    public synchronized void start() {
        super.start();
        running = true;
    }
}

像这样更改 MQTT 服务的 onStartCommand 方法:

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG, "onStartCommand: service");

    super.onStartCommand(intent, flags, startId);

    // Start the MQTT Thread:
    if (!connection.isRunning()) {
        connection.start();
    }
    return START_STICKY;
}

日志:

==>: constructor MqttConnection: service
==>: MsgHandler: constructor
MQTT_SERVICE_TAG: onStartCommand: service
==>: handleMessage: MsgHandler1

希望对您有所帮助。