2015-07-03 2 views
0

Уточнение: я не хочу, чтобы устройство не спало, я просто хочу выполнить свою команду каждый раз, когда экран включен.Как написать приложение Android, действующее на ACTION_SCREEN_ON, без остановки через какое-то время?

Короткий фон, почему я хочу сделать это

Некоторые OnePlus Один телефон имеет неприятную ошибку, когда сенсорный экран получает более или менее отвечать на запросы через некоторое время. Запуск cat /sys/class/input/input0/baseline_test в качестве корня улучшает ситуацию на некоторое время, по крайней мере для некоторых пользователей. Поскольку проблемы часто возникают, когда телефон находится в спящем режиме, его может быть очень сложно разблокировать. Поэтому я хочу запускать эту команду каждый раз, когда экран телефона активирован.

Да, я знаю, я могу сделать это с помощью Tasker, но где это забава? :)

Так, к моей проблеме

Я не андроид разработчик, но я был в состоянии написать приложение, которое делает именно это. Он работает отлично, около часа или около того, после чего он просто перестает работать. Я регистрирую намерение ACTION_SCREEN_ON в коде, поскольку по какой-то причине это невозможно сделать в манифесте. Итак, мой, надеюсь, простой вопрос, как мне изменить мое приложение, чтобы оно не было остановлено в фоновом режиме. Помогла бы мне служба?

Мой код:

import ...; 

public class ConfigurationActivity extends Activity { 

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

    public void onDestroy(Bundle savedInstanceState) { 
     unregisterReceiver(); 
    } 

    private BroadcastReceiver mPowerKeyReceiver = null; 

    private void registBroadcastReceiver() { 
     final IntentFilter theFilter = new IntentFilter(); 

     theFilter.addAction(Intent.ACTION_SCREEN_ON); 

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

       if (strAction.equals(Intent.ACTION_SCREEN_ON)) { 
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
        String[] commands = {"cat /sys/class/input/input0/baseline_test"}; 
        RunAsRoot(commands); 
        v.vibrate(25); 
       } 
      } 
     }; 
     getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter); 
    } 

    private void unregisterReceiver() { 
      getApplicationContext().unregisterReceiver(mPowerKeyReceiver); 
      mPowerKeyReceiver = null; 
    } 

    public void RunAsRoot(String[] cmds){ 
     Process p = null; 
     try { 
      p = Runtime.getRuntime().exec("su"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
     for (String tmpCmd : cmds) { 
      try { 
       os.writeBytes(tmpCmd+"\n"); 
       os.writeBytes("exit\n"); 
       os.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

ответ

0

Используйте этот

private void unlockScreen() { 
     Window window = this.getWindow(); 
     window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); 
     window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON); 
    } 

Добавить это разрешение

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

Разве это не просто запретить устройство от сна ? – jaqob

+0

вы можете использовать этот mWakeLock = getContext(). GetSystemService (Context.POWER_SERVICE) .newWakeLock (PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass(). GetName()); – atifali

0

Я уже отправил ответ на подобный вопрос Проверьте
Turning on screen from receiver/service
или же проверить это,
How to Lock/Unlock screen programmatically?

Обновлено:

Лучший способ сделать это состоит в использовании FLAG_KEEP_SCREEN_ON в своей деятельности (и только в деятельности, никогда в служебной или иной компонент приложения).

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 

Другой способ реализовать это в файле макета XML вашего приложения, используя android:keepScreenOn атрибут:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true"> 
    ... 
</RelativeLayout> 

Для получения дополнительной справки click here

+0

Возможно, мой английский плохой, но моя проблема НЕ в том, что я хочу сохранить устройство в живых. Я просто хочу, чтобы мой кусок кода выполнялся, когда экран включен.Мой код работает отлично, но кажется, что через некоторое время он остановлен. – jaqob