6

コード -

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

1 に答える 1

2

これが古いことは知っていますが、上記の資料に従う部分的な解決策があります。少なくともシャットダウン イベントが呼び出され、シャットダウン時にその固有の項目を実行できますが、理解できない副作用があります。メモリリーク。ある意味ではシャットダウンしているので、メモリリークは劇的な影響はありませんが、私はそれを理解していません。それは面倒です。

いずれにせよ、この BroadcastReceiver に関して manifest.xml に追加はありません。コードで完全に定義されています。

私の主な活動では、上記のようにクラスを定義します

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 に注意が払われ、呼び出す必要のあるアクションが実行されます。

これが誰か(おそらくサービスのシャットダウンを扱っていない人)に役立つことを願っています.

于 2014-03-23T14:36:02.097 に答える