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
希望对您有所帮助。
我创建了一个服务,然后在 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
希望对您有所帮助。