我知道这已经很旧了,但我有一个遵循上面材料的部分解决方案。至少调用了关闭事件,并且我能够在关闭时执行该独特的操作,但是有一个我不明白的副作用;内存泄漏。从某种意义上说,它是关闭的,因此内存泄漏没有严重的影响,但我不明白它,这很麻烦。
无论如何,我在manifest.xml 中没有与此BroadcastReceiver 有关的任何添加内容。它完全在代码中定义。
在我的主要活动中定义一个类,如上所述
private class ShutDownReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(Intent.ACTION_SHUTDOWN.equals(intent.getAction()))
{
Log.i(TAG, "System shutting down");
context.stopService(new Intent(context, BluetoothPanService.class));
}
}
}
在主活动的 onResume() 方法中,我实例化并注册接收器:
public void onResume()
{
super.onResume();
Log.i(TAG, "Measurement Log Activity has Resumed.");
IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN);
mReceiver = new ShutDownReceiver();
registerReceiver(mReceiver, filter);
}
('mReceiver'被定义为主活动的私有类变量)
最后在主活动的 onPause() 中我取消注册接收器
public void onPause()
{
super.onPause();
Log.i(TAG, "Measurement Log Activity has Paused.");
this.unregisterReceiver(mReceiver);
}
当手机关机时,确实会发出 ACTION_SHUTDOWN 事件信号并停止服务;它的 onDestroy() 方法收到信号,并向远程 MQTT 代理服务发布一条消息,表明客户端不再连接。远程代理正在收到消息,因此我知道它正在工作。
然而,在那之后一切都崩溃了,这主要是因为我无法阻止我的服务重新启动(即使我在 onStartCommand 方法中设置了 START_NOT_STICKY )。但此时,除了在 logcat 中出现大量红色错误行之外,还会注意到 ACTION_SHUTDOWN 并且我需要调用的操作已完成。
希望这对某人(可能不涉及关闭服务的人)有帮助。