代码 -
public class ShutdownReceiver extends BroadcastReceiver {
private static final String TAG = "ShutdownReceiver";
@Override
public void onReceive(final Context context, final Intent intent) {
Logger.i(TAG, "Shutting Down..........................");
if("android.intent.action.ACTION_SHUTDOWN".equals(intent.getAction())) {
//Power Off
}
}
}
服务
private BroadcastReceiver mReceiver = null;
@Override
public void onCreate() {
super.onCreate();
// INITIALIZE RECEIVER
//It is used to register broadcast for ShutDown or Power Off
IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN);
mReceiver = new ShutdownReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public void onDestroy() {
unregisterReceiver(mReceiver);
}
权限 -
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
答案 0 :(得分:2)
我知道这是旧的,但我有一个部分解决方案,遵循上面的材料。至少调用了关闭事件,我可以在关机时执行该唯一项目,但是有一个我不明白的副作用;内存泄漏。在某种意义上它是关闭所以内存泄漏没有剧烈的影响,但我不明白它,这是一个麻烦。
在任何情况下,我都没有在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));
}
}
}
在main活动的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并且我需要调用的操作完成。
希望这可以帮助某人(可能没有处理关闭服务的问题)。