2013-05-29 64 views
13

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

下面是在应用程序

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"); 
     } 
    } 
} 
+0

您可能想要创建一个[服务](https://developer.android.com/reference/android/app/Service.html) –

+0

但接收事件呢? –

+1

你真的需要监视屏幕开/关事件吗?他们强迫你注册一个不在清单中的接收者的原因是他们不希望人们总是监视这些事件并放慢设备速度。 – natez0r

回答

17

您可以使用一个服务

在主应用程序的启动/停止该服务的代码

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, e.g. send Intent to main app 
    } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(m_ScreenOffReceiver, filter); 
} 
} 
+0

这应该被接受为答案。 – Talha

0

您可以启动在前台运行的服务。这是确保(主要)确保您的应用能够获得事件的唯一方法。在操作系统发生疯狂的内存压力时,你的前台服务仍然有可能会被杀死(所以它不是万无一失的)。如果你在前台启动一个服务,用户会看到一个持久通知,以知道它始终在运行。

因此,故事的寓意是,您是否真的需要始终监控屏幕关闭/开启事件?他们强迫你注册一个不在清单中的接收者的原因是他们不希望人们总是监视这些事件并放慢设备速度。你想达到什么目的?

5

如果申报清单中的广播接收器,它将始终是积极的,并且即使关闭应用程序调用/停止

+5

无法在清单文件中声明SCREEN_ON和SCREEN_OFF。 – alfoks

+0

@alfoks:为什么SCREEN_ON和SCREEN_OFF不能在AndroidManifest中声明?你能解释一下 – Kushal

+0

@Kushal他们是如何选择实施它的。我不记得背后的理由。 – alfoks

0

您无法通过在清单中声明组件收到一些广播事件。

这些事件

  • ACTION_BATTERY_CHANGED
  • ACTION_CONFIGURATION_CHANGED
  • ACTION_SCREEN_OFF (您正在播放与此事件)
  • ACTION_SCREEN_ON (您正在播放与此事件)
  • ACTION_TIME_TICK

参考https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

因此,在您的特定事件, 你必须创建一个服务&你将不得不在服务的onCreate(显式地注册你的事件)与Context.registerReceiver()。

对于其他事件, 进入清单是足够的。

相关问题