2013-01-03 56 views
4

碼 -的Android ACTION_SHUTDOWN廣播不能正常工作

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

回答

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

} 

在主活性的的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被注意,我需要調用的操作完成。

希望這可以幫助某人(可能沒有處理關閉服務)。