2017-06-06 78 views
0

我想在后台处理Android应用程序工作。我读过,我必须使用服务为此。 在这个应用程序中,我需要知道屏幕什么时候被锁定以及什么时候再次解锁。每次发生这种情况,我都必须采取一些行动。Android在服务中如何知道屏幕锁定的时间?

对于活动,我已经看到我们有onPause和onRestart这个,但我需要知道何时关闭屏幕以及何时在服务中打开它。如何从服务内部检索这些信息。

+0

请确保你真的想知道是否该设备被_locked_,因为你可以从关于潜在重复问题的“讨论”中看到,这可能永远不会是这样。另外,我认为这种方法并不是应该做的,但这是另一点。 –

回答

1

打开/关闭屏幕会产生系统事件。你必须听取这些广播并捕捉它们。将此添加到您的清单中:

<receiver android:name=".ScreenLockBroadcastReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.USER_PRESENT" /> 
    <action android:name="android.intent.action.ACTION_SHUTDOWN" /> 
</intent-filter> 
</receiver> 

然后注册一个广播接收器将其捕获到您的服务中。

public class ScreenLockBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { 
      // do stuff 
     } 
    } 
} 
+0

我已经尝试过,而且这项工作! 但是这段代码只能告诉我屏幕何时开启,而不是屏幕锁定时。 如果(intent.getAction()。equals(Intent.ACTION_SHUTDOWN)) 我已经证明在代码中加上这个: 但是不行,你知道我该如何添加这个功能? – Simone

+0

您需要检查系统广播列表并找到您需要的广播。你可以在这里找到这个列表:https://developer.android.com/reference/android/content/Intent。html –

+0

此外,如果只有第一个意图被捕获,请尝试将它们放在您的清单中的单独的中s –

0

您可以使用此

KeyguardManager keyguardManager = (KeyguardManager) 
context.getSystemService(Context.KEYGUARD_SERVICE); 
if(keyguardManager.inKeyguardRestrictedInputMode()) { 
    //it is locked 
    } else { 
    //it is not locked 
} 

希望这有助于。

+0

嗨,感谢您的回复,但是我要添加这个吗?我希望服务能够在后台工作,并且必须始终捕获屏幕开启和屏幕关闭。 我已尝试将此代码插入到服务的构造函数中,但我有一个错误: java.lang.RuntimeException:无法实例化服务com.example.simon.dataconnection.DisableDataService:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.Object android.content.Context.getSystemService(java.lang.String)'null对象引用 – Simone

+0

关于thr服务,我将不得不研究这个。 –

+0

它看起来像你从[这里]复制它(https://stackoverflow.com/a/8668648/1856738)。 1)这是Q作为重复链接的确切问答。 2)原始A提到了你没有复制的限制。请考虑到在问答网站上复制是没有用的。副本越少,找到正确答案的机会就越高 - 简单的搜索机器人算法。是的,在这种情况下积累信用点更加困难,但会导致更高的质量。 –

0

使用此行为在接收器标签清单中

<action android:name="android.intent.action.SCREEN_ON" /> 
<action android:name="android.intent.action.SCREEN_OFF" /> 
+0

我必须尝试这一点,我已经插入这个清单,并在接收方onReceive我已经插入这两个方法,如果(intent.getAction()。等于(Intent.ACTION_SCREEN_ON))和如果(意图.getAction()。equals(Intent.ACTION_SCREEN_OFF))但是不起作用,当我的屏幕打开或关闭时,如果没有输入。 你知道我该如何解决这个问题? – Simone

+0

你注册了你的广播吗? – Pratik

+0

ScreenLockBroadcastReceiver mBroadcastReceiver = new ScreenLockBroadcastReceiver(); IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mBroadcastReceiver,screenStateFilter); – Pratik

0

我想在后台创建Android应用程序的工作,我读过,我必须使用的服务。

是的,可能你必须使用服务来检查屏幕仍然开着或熄灭。例如在Services类的onCreate中。

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver broadcast = new MyBroadcastReciverClass(); //or registerReceiver(broadcast , intentFilter);

其实:

Intent.ACTION_SCREEN_OFF 

Intent.ACTION_SCREEN_ON 

是将在你的BroadcastReceiver走得太2分主要的事情。例如,在您的onReceive方法:

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     // CODE HERE FOR SCREEN OFF 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     // CODE HERE FOR SCREEN ON 
    } 

如需更详细的expnlanation借此文章一看:https://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/