如何编写一个作用于ACTION_SCREEN_ON的Android应用程序,而不是在一段时间后停止?

时间:2015-07-03 11:30:21

标签: android broadcastreceiver oneplusone

澄清:我不想让设备保持清醒状态,我只想在每次开启屏幕时执行命令。

我想要这样做的简短背景

一些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();
            }
        }
    }
}

2 个答案:

答案 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