应用程序closures后,让广播接收器继续运行

我需要让应用程序启动后,广播接收器始终运行。

这是在应用程序中注册该接收器的代码

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver mReceiver = new ScreenEventsReceiver(); registerReceiver(mReceiver, filter); 

和接收器的代码

 public class ScreenEventsReceiver extends BroadcastReceiver { public static boolean wasScreenOn = true; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { wasScreenOn = false; Log.d("ScreenEventReceiver", "ON"); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { wasScreenOn = true; Log.d("ScreenEventReceiver", "ON"); } } } 

您可以使用服务

在主应用程序启动/停止服务

 Intent service = new Intent(context, MyService.class); context.startService(service); ... Intent service = new Intent(context, MyService.class); context.stopService(service); 

服务

 public class MyService extends Service { private static BroadcastReceiver m_ScreenOffReceiver; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { registerScreenOffReceiver(); } @Override public void onDestroy() { unregisterReceiver(m_ScreenOffReceiver); m_ScreenOffReceiver = null; } private void registerScreenOffReceiver() { m_ScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "ACTION_SCREEN_OFF"); // do something, eg send Intent to main app } }; IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(m_ScreenOffReceiver, filter); } } 

如果您在清单中声明BroadcastReceiver,即使应用程序已closures/停止,它也将始终处于活动状态并被调用

您可以启动在前台运行的服务。 这是确保(大部分)您的应用程序将获得事件的唯一方法。 在操作系统发出疯狂的内存压力的时候,你的前台服务仍然有可能被杀死(所以这不是一个简单的办法)。 如果你在前台启动一个服务,用户会看到一个持久的通知,以知道它始终在运行。

所以这个故事的寓意是,你是否真的需要随时监视屏幕上的事件? 他们强迫你注册一个不在清单上的接收者的原因是他们不希望人们总是监视这些事件并拖慢设备。 你想完成什么?

如果您使用的是Android 4.4.x,请小心,因为在closures应用程序时有一个会导致后台服务中断的错误。 我在Android 4.4.2testing我的应用程序,我有同样的问题。 这里有一个详细的解释:

http://www.androidpolice.com/2014/03/07/bug-watch-stopping-apps-on-android-4-4-2-can-silently-kill-related-background-services-a-fix-正在路上/