2013-10-10 24 views
2

我已經實施了一項Android設備服務(START_STICKY),它在設備啓動時啓動並在後臺運行。這項服務的功能是與SD卡交互。隨着它不斷運行,從粘性開始消耗電池。爲了解決沉重的電池消耗,我想在用戶使用設備時啓動此服務。如何在用戶開始使用android設備時啓動後臺服務?

理想情況下基於ACTION_SCREEN_ON & ACTION_SCREEN_OFF意圖的啓動/停止服務。

當我已經測試了這個發現,我不能註冊在清單ACTION_SCREEN_OFF & ACTION_SCREEN_ON,所以我在服務中創建的廣播接收機捕獲ACTION_SCREEN_OFF & ACTION_SCREEN_ON

但是,由於我無法註冊清單中的意圖,因此我在ACTION_SCREEN_OFF上停止了我的服務。如何在屏幕重新開啓時啓動它?

注意: 正如我已經提到SCREEN_ON + SCREEN_OFF不能在清單文件中註冊。這是註冊像

// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC 

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
filter.addAction(Intent.ACTION_SCREEN_OFF); 
broadcastReceiver = new TestReceiver(); 
registerReceiver(broadcastReceiver, filter); 

所以,當服務沒有運行,然後這個意圖不會觸發。

+0

那麼,在你的廣播接收器的SCREEN_ON + SCREEN_OFF,簡單地轉發這些通過startService的服務,同樣的動作。在服務中,你可以在onStartCommand中檢查意圖的動作,如果它是screen_on - >啓動服務,如果是screen_off,服務應該已經在運行,所以你關閉它。 – damian

+0

正如我已經提到SCREEN_ON + SCREEN_OFF不能在清單文件中註冊。所以當服務沒有運行時它不會被調用。 – Sachin

+0

類似的問題:http://stackoverflow.com/questions/9477922/android-broadcast-receiver-for-screen-on-and-screen-off和答案是,你必須使用長期服務(粘性)。 – aleung

回答

1

可以使用BroadCastReciever基於

public class MyReceiver extends BroadcastReceiver { 

    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 

      // do whatever you need to do here 

     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       // and do whatever you need to do here 

     } 
     else if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
     { 
      // and do whatever you need to do here 
     } 

    } 
+0

正如我已經提到SCREEN_ON + SCREEN_OFF不能在清單文件中註冊。它是註冊/ /註冊接收器,處理屏幕和屏幕關閉邏輯IntentFilter過濾=新的IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); broadcastReceiver = new TestReceiver(); registerReceiver(broadcastReceiver,filter);所以當服務沒有運行時就會啓動。 – Sachin

+0

看到我正在開發一個自定義鎖定屏幕,我也必須檢測屏幕狀態,它爲我工作..我已經註冊接收機在清單中: r4jiv007

+0

是的,你是對的。 BOOT_COMPLETED可以在清單中註冊並且可以工作。但是當我們在清單中註冊SCREEN_ON&SCREEN_OFF時,你不會在屏幕上開/關。你可以試試。所以,如果它被android系統殺死,我無法啓動服務。我已經看到,即使它很粘,當設備處於睡眠模式時,它會被殺死並不會再次啓動。 – Sachin

0

有一個廣播接收器ACTION_SCREEN_ON,ACTION_SCREEN_OFF和ACTION_USER_PRESENT廣播的類型打電話給你的服務。

當觸發ACTION_SCREEN_ON時,會調用onResume的活動。創建一個處理程序並等待ACTION_USER_PRESENT。當它被解僱時,實施你想要的活動。

登記接收如下:

private void registBroadcastReceiver() { 
    final IntentFilter theFilter = new IntentFilter(); 
    /** System Defined Broadcast */ 
    theFilter.addAction(Intent.ACTION_SCREEN_ON); 
    theFilter.addAction(Intent.ACTION_SCREEN_OFF); 

    mPowerKeyReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String strAction = intent.getAction(); 

      if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) { 
       // > Your playground~! 
      } 
     } 
    }; 

    getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter); 
} 
+0

正如我所提到的那樣,它是後臺服務,而不是活動。 SO沒有onResume功能。 – Sachin

+0

看到我編輯的答案 –

相關問題