2013-01-03 5 views
4

코드를 작동하지안드로이드 ACTION_SHUTDOWN 방송

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

답변

2

나는이 오래 알고 있지만 나는 다음과 부분적인 해결책을 위의 자료. 최소한 shutdown 이벤트가 호출되고 종료시 해당 고유 항목을 수행 할 수 있지만 이해할 수없는 부작용이 있습니다. 메모리 누출. 하나의 의미에서 그것은 메모리 누수가 과감한 효과가 없도록하기 위해 셧다운이긴하지만 이해가되지 않는다.

어쨌든 나는이 BroadcastReceiver와 관련하여 manifest.xml에 추가 사항이 없습니다. 이것은 코드에서 완전히 정의됩니다. 내 주요 활동에서

것은 내가 인스턴스화 상기 주요 활동의 onResume에서

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)); 
     } 
    } 

} 

(위 같은 클래스) 메소드를 정의하고 수신기 등록 :

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이주의를 기울여서 호출해야하는 작업이 완료됩니다.

희망은 누군가 (누가 서비스를 종료하는 것을 다루지 않는 사람)를 도울 수 있기를 바랍니다.