【问题标题】:Android ACTION_SHUTDOWN Broadcast not workingAndroid ACTION_SHUTDOWN 广播不起作用
【发布时间】:2013-01-03 04:30:06
【问题描述】:

代码-

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" />

【问题讨论】:

  • 你的代码对我来说很好用……谢谢

标签: android bootcompleted powermanager


【解决方案1】:

我知道这是旧的,但我有一个遵循上述材料的部分解决方案。至少调用了关机事件,并且我可以在关机时执行该独特的项目,但是有一个我不明白的副作用;内存泄漏。从某种意义上说,它已关闭,因此内存泄漏没有严重影响,但我不明白,这很麻烦。

无论如何,我在 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'被定义为主Activity的私有类变量)

最后在主要活动的 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 并且我需要调用的操作已经完成。

希望这可以帮助某人(可能没有处理关闭服务的问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2017-10-12
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多