2012-02-28 194 views
49

我只是想知道是否可以注册检测应用程序清单中的屏幕ON/OFF的广播接收器。 我不喜欢可编程方法的原因是它需要运行应用程序才能检测到这样的事情,而: “在清单中注册了广播接收器的应用程序不必运行(:专业的Android 2应用开发书源)android:广播接收器,用于屏幕和屏幕关闭

我的应用程序实际上是一个锁屏应用程序,它通过使用可编程方式需要运行所有的时间:S

一心一意为执行接收机”播出有办法解决它吗?

我想在清单如下:

<receiver android:name=".MyBroadCastReciever"> 
    <intent-filter> 
     <action android:name="android.intent.action.SCREEN_OFF"/> 
     <action android:name="android.intent.action.SCREEN_ON"/> 
    </intent-filter> 
</receiver> 

和简单MyBroadCastReciever类:

public class MyBroadCastReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.i("Check","Screen went OFF"); 
      Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show(); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.i("Check","Screen went ON"); 
      Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

你可以给我一个样品吗?我想在屏幕锁定或解锁时执行某些操作。 – 2015-01-18 13:42:38

回答

66

两个动作的屏幕打开和关闭是:

android.intent.action.SCREEN_OFF 
android.intent.action.SCREEN_ON 

但是,如果您在清单中注册这些广播的接收器,则接收器将不会收到这些广播秒。

对于这个问题,你必须创建一个长期运行的服务,这是注册为这些意图本地广播接收机。如果你这样做,那么只有当你的服务运行时,你的应用程序才会查找屏幕,这不会刺激用户。

PS:在前台启动服务,使其运行时间更长。

一个简单的代码片段将是这样的:

IntentFilter screenStateFilter = new IntentFilter(); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
registerReceiver(mScreenStateReceiver, screenStateFilter); 

不要忘记注销接收器在服务的onDestroy

unregisterReceiver(mScreenStateReceiver); 

以防万一对于询问为什么接收器不能在ACTION_SCREEN_ON和ACTION_SCREEN_OFF的清单中声明广播的人员:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ONhttps://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

您无法通过舱单申报部件用Context.registerReceiver明确注册为它收到此,仅 ()。

这是受保护的意图,只能由系统发送。

+4

好,所以没有办法解决它吗?这是如何完成锁屏应用程序? – himura 2012-02-28 07:30:52

+4

很好的答案,但为什么接收器不能用于清单中的这些广播? – 2015-07-14 08:59:48

+1

如果您可以在清单中侦听ACTION_SCREEN_OFF,则操作系统将不得不为应用程序启动一个新的进程,前提是它在广播被触发时未运行。 Android设计师想要防止这种情况,因为它通常意味着设备即将进入低功耗状态。 – 2016-10-03 08:10:39

0

你需要创建一个后台服务,以检查它。然后你可以通过编程来设置它。