Уточнение: я не хочу, чтобы устройство не спало, я просто хочу выполнить свою команду каждый раз, когда экран включен.Как написать приложение 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();
}
}
}
}
Разве это не просто запретить устройство от сна ? – jaqob
вы можете использовать этот mWakeLock = getContext(). GetSystemService (Context.POWER_SERVICE) .newWakeLock (PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass(). GetName()); – atifali