澄清:我不想让设备保持清醒状态,我只想在每次开启屏幕时执行命令。
我想要这样做的简短背景
一些Oneplus One手机有一个令人讨厌的错误,一段时间后触摸屏或多或少没有反应。以root身份运行cat /sys/class/input/input0/baseline_test
可以改善一段时间的情况,至少对于某些用户而言。
由于当手机处于睡眠模式时问题经常出现,因此解锁手机可能非常困难。所以,我希望每次激活手机屏幕时都运行此命令。
是的,我知道,我可以用Tasker做到这一点,但那里的乐趣在哪里? :)
所以,我的问题
我不是一个Android开发人员,但我已经能够编写一个这样做的应用程序。它工作得很好,大约一个小时左右,之后就停止工作了。我在代码中注册了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 :(得分: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" />
答案 1 :(得分: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