Как я могу узнать, включен ли экран в Android?

Кроме того, вы можете использовать «& amp;» чтобы запускать много процессов через одно (1) ssh-соединения, чтобы поддерживать минимальное количество терминалов. Например, у меня есть один процесс, который прослушивает сообщения для извлечения файлов, второй процесс прослушивает сообщения для загрузки файлов: используя «& amp;» Я могу запускать обе службы в одном терминале через одно подключение ssh к моему серверу. ***** Я только понял, что эти процессы проходят через "& amp;" также будет «оставаться в живых» после закрытия сессии ssh! довольно аккуратно и полезно, если ваше соединение с сервером прерывается **

29
задан Falko 9 September 2015 в 11:54
поделиться

6 ответов

Вы можете сделать это, настроив вещательные приемники для ACTION_SCREEN_ON и ACTION_SCREEN_OFF.

8
ответ дан Roman Nurik 9 September 2015 в 11:54
поделиться

Я использую следующую функцию:

public boolean isInteractive() {
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH 
        ? powerManager.isInteractive() 
        : powerManager.isScreenOn();
}
8
ответ дан sroes 9 September 2015 в 11:54
поделиться

Вот как вы должны это сделать:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean result= VERSION.SDK_INT>=VERSION_CODES.KITKAT_WATCH&&powerManager.isInteractive()||VERSION.SDK_INT<VERSION_CODES.KITKAT_WATCH&&powerManager.isScreenOn();
return result;
26
ответ дан android developer 9 September 2015 в 11:54
поделиться

Есть лучший способ, чем использование BroadcastReceivers:

// If you use API20 or more:
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;

// If you use less than API20:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager.isScreenOn()){ return true; }

Обратите внимание, что Display.getState() также может возвращать STATE_DOZE и STATE_DOZE_SUSPEND, что означает, что экран включен особым образом. Больше информации о Display.getState() и его возвращаемых значениях здесь: http://developer.android.com/reference/android/view/Display.html#getState ()

Также обратите внимание, что хотя официальная документация рекомендует использовать isInteractive() вместо isScreenOn(), если вы действительно хотите знать состояние экрана, лучше выбрать Display.getState() из-за «особых» условий, при которых экран включается, пока устройство не интерактивный.

64
ответ дан Jorge Fuentes González 9 September 2015 в 11:54
поделиться

MainActivity.Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_HEADSET_PLUG);
        filter.addAction(Intent.ACTION_POWER_CONNECTED);
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        registerReceiver(new MyReceiver(), filter);
    }
}

MyReciever.Java

public class MyReceiver extends BroadcastReceiver {

    MainActivity mActivity;

    @Override
    public void onReceive(Context arg0, Intent arg1) {

        mActivity = (MainActivity) arg0;

        TextView tv = (TextView)mActivity.findViewById(R.id.textView1);

        if(arg1.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            tv.setText("Headset Plugin ");
        } else if(arg1.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            tv.setText("Power Connected  ");
        } else if(arg1.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            tv.setText("Power Disconnected  ");
        } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            tv.setText("Screen ON ");
        } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            tv.setText("Screen OFF ");
        }   
    }
}
1
ответ дан NatNgs 9 September 2015 в 11:54
поделиться

Я публикую это, потому что на устройстве HUAWAI Prism II Android 4.1.1 (API 16) игра, над которой я работаю ( http://www.playlunapuma.com ) было следующее раздражающее поведение:

Я отображаю свое главное меню, которое имеет некоторую анимацию в SurfaceView и воспроизводит звук время от времени. Устройство отключается, затемняется и затем гаснет. Он вызывает onDestroy для моей Активности, а затем при выключенном экране снова создает мою Активность, вызывая onCreate! Так что проблема в том, что моя анимация и звуки воспроизводятся при выключенном экране. Я действительно хочу, чтобы цикл анимации вообще не работал, если экран выключен. Приемники вещания не работают, потому что я не могу сохранить состояние с момента последнего отключения экрана. Я думал о некоторых хакерских атаках со статическими логическими значениями, но это только казалось, что kluge может не работать и иметь ужасные крайние случаи. Экран уже выключен, когда моя активность снова создается, поэтому я не получу событие через приемник вещания, что мой экран выключен.

Я решил это, используя и широковещательный приемник, и код, указанный выше.

В моем onCreate я создаю широковещательный приемник. Это будет контролировать мой цикл анимации при включении и выключении экрана.

if (mScreenReceiver == null) {
    mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    mScreenReceiver = new ScreenReceiver();
    registerReceiver(mScreenReceiver, mScreenIntentFilter);
}
public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {                
            controlAnimLoop(false, false, true);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            controlAnimLoop(false, false, false);
        }
    }

}

В моем controlAnimLoop я проверяю isScreenOn, это код:

private boolean isScreenOn() {
    if (android.os.Build.VERSION.SDK_INT >= 20) {
        // I'm counting                                                                                                                
        // STATE_DOZE, STATE_OFF, STATE_DOZE_SUSPENDED                                                                                 
        // all as "OFF"                                                                                                                

        DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
        for (Display display : dm.getDisplays ()) {
            if (display.getState () == Display.STATE_ON ||
                display.getState () == Display.STATE_UNKNOWN) {
                return true;
            }
        }

        return false;
    }

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

    return powerManager.isScreenOn();
}
3
ответ дан NatNgs 9 September 2015 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: