2014-12-05 18 views
7

Chciałbym utworzyć działanie StandBy dla mojego urządzenia i do tej pory stworzyłem działanie, które po wywołaniu wyłącza mój wyświetlacz.StandBy lubię działalność

Kod jest następujący:

public class MainActivity extends Activity { 
private SensorManager mSensorManager; 
private PowerManager mPowerManager; 
private WindowManager mWindowManager; 
private WakeLock mWakeLock; 
private Button button; 
private TextView textView; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     // Get an instance of the SensorManager 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

     // Get an instance of the PowerManager 
     mPowerManager = (PowerManager) getSystemService(POWER_SERVICE); 

     // Get an instance of the WindowManager 
     mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     mWindowManager.getDefaultDisplay(); 

     setContentView(R.layout.activity_main); 
     // textView = (TextView)findViewById(R.id.textView1); 
     button = (Button) findViewById(R.id.testText); 
     button.setOnClickListener(mButtonStopListener); 

     mWakeLock = mPowerManager.newWakeLock(
       PowerManager.PARTIAL_WAKE_LOCK, "Your Tag"); 
     // mWakeLock.acquire(); 
     final WindowManager.LayoutParams params = getWindow() 
       .getAttributes(); 
     params.screenBrightness = 0; 
     getWindow().setAttributes(params); 

    } catch (final Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e("onCreate", e.getMessage()); 
    } 
} // END onCreate 

View.OnClickListener mButtonStopListener = new OnClickListener() { 
    @Override 
    public void onClick(final View v) { 
     try { 
      if (mWakeLock.isHeld()) { 
       mWakeLock.release(); 
       System.err.println("mWakeLock.release() onTouch"); 
      } 
     } catch (final Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.e("onPause", e.getMessage()); 
     } 

    } 
}; 

@Override 
protected void onResume() { 
    super.onResume(); 

    try { 
     if (mWakeLock.isHeld()) { 
      System.err.println("mWakeLock.release() onResume"); 
      mWakeLock.release(); 
     } else { 
      System.err.println("mWakeLock.acquire() onResume"); 
      mWakeLock.acquire(); 

     } 
    } catch (final Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e("onResume", e.getMessage()); 
    } 

} 

@Override 
protected void onPause() { 
    super.onPause(); 


} 

}

Jak powiedziałem to kod umożliwi mi wyłączyć ekran, a ja jestem w stanie włączyć ekran dwukrotne kliknięcie przycisku zasilania (Nie wiem, dlaczego mam dwa razy kliknij przycisk, ale jest to problem dodatkowy).

Głównym problemem jest to, że po wyłączeniu wyświetlacza generowana jest akcja ACTION_SCREEN_OFF, co powoduje, że android EthernetService wyłącza moje połączenie. Czy ktoś wie, jak utrzymywać połączenie aktywne?

Dzięki;)

+0

Nie jestem do końca pewien, co chcesz, ale byłoby to możliwe, aby umieścić połączenia w usłudze, która posiada blokadę wybudzającą? Jeśli coś pobierasz, upuść blokadę wybudzania, aby urządzenie mogło zrobić pełny sen. Jeśli próbujesz utrzymać połączenie otwarte, może to być dość poważny zlew baterii. – DeeV

+0

Moim problemem jest to, że muszę obudzić moje urządzenie (nawet ekran) z wiadomością otrzymaną z mojego połączenia, więc nie mogę stracić połączenia (nie mam nic przeciwko problemowi z baterią, jedyną potrzebą snu z ekranu jest aby zaoszczędzić czas wyświetlania). –

+0

jeśli posiadasz PARTIAL_WAKE_LOCK, połączenia internetowego nie należy wyłączać. –

Odpowiedz

2

Z pytaniem widzę, że trzeba zachować usługę Ethernet żyje.

Po pierwsze, problem mógł zostać rozwiązany, jeśli na urządzeniu było połączenie Wi-Fi i dostępne było połączenie Wi-Fi. W takim przypadku można użyć funkcji WifiLock wraz z częściowym WakeLock - see this question.

Jeśli jednak naprawdę potrzebujesz użyć połączenia Ethernet, możesz spróbować listening for ACTION_SCREEN_OFF intent, a następnie próbować ponownie włączyć łączność Ethernet, postępując zgodnie z instrukcjami w top reply to this question. Pamiętaj jednak, że w takim przypadku Twoje urządzenie może być zrootowane.

Nadzieja to pomaga ..

+0

Dzięki za odpowiedź, niestety nie mogę używać Wi-Fi. Nawet drugie rozwiązanie, które sugerujesz, nie jest dla mnie dobre, ponieważ potrzebuję połączenia ethernetowego, aby pozostać przy życiu i nie zejść, a potem znowu :( –

2

jestem w stanie włączyć ekran dwukrotne kliknięcie przycisku zasilania (nie wiem dlaczego Mam dwa kliknij dwa razy przycisk, ale to jest wtórny Emisja)

tak się dzieje, ponieważ technicznie ekran jest nadal przy jasności ustawionej na zero, więc to, co faktycznie się dzieje, jesteś wyłączyć ekran z pierwszego następnie naciśnij przycisk zasilania ON, to dwa kliknięcia.

Podejrzewam, że połączenie zostało wyłączone dopiero po pierwszym naciśnięciu przycisku zasilania. Nie widzę, gdzie w podanym kodzie przywracasz jasność ekranu.

Spróbuj ustawić wartość ekranu ScreenBrightness na 0.2 zamiast zera i monitoruj stan połączenia lub log. Również poniższy kod powinien wystarczyć.

Obróć ekran „trochę” off

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
previousScreenBrightness = params.screenBrightness; 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 

włączyć ekran z powrotem na

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.screenBrightness = previousScreenBrightness; 
getWindow().setAttributes(params); 
+0

Niestety to nie jest to, czego potrzebuję. W ten sposób ekran nie całkowicie wyłączyć. –

Powiązane problemy