从窗口小部件获取SCREEN_ON和SCREEN_OFF意图

时间:2011-11-19 13:42:11

标签: android android-widget

我有一个小部件,我想检查屏幕是否已关闭。

我无法使用PowerMananger.isScreenOn,因为我想支持Android 1.5 / 1.6。

所以我尝试在清单中注册SCREEN_ON / SCREEN_OFF操作,但这不起作用。似乎只有registerReceiver适用于那些意图。 (Android - how to receive broadcast intents ACTION_SCREEN_ON/OFF?

问题是,我应该在哪里注册我的小部件?

我无法在我的小部件中注册屏幕意图接收器,因为您无法从清单中声明的​​另一个BroadcastReceiver调用registerReceiver。

我想过在我的配置活动的onCreate中调用它。

问题是我没有调用unregisterReceiver,所以我得到了泄漏的例外。

还有其他解决办法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

我的解决方案是在AppwidgetProvider子类中的public void onReceive(Context context, Intent intent)方法中启动服务。像:

        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_ENABLED)) {
        Intent listenerService=new Intent(context,ScreenMoniterService.class);
        startService(listenerService);
        return;
    }

然后在此服务的public void onCreate()方法中,注册BroadcastReceiver,并在public void onDestroy()方法中取消注册。 当然,您应该在删除所有appwidget时停止该服务。

        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DISABLED)) {

        Intent listenerService=new Intent(context,ScreenMoniterService.class);
        stopService(listenerService);
        return;
    }

答案 1 :(得分:0)

registerReceiver:

final IntentFilter bcFilter = new IntentFilter(); bcFilter.addAction(Intent.ACTION_SCREEN_ON); bcFilter.addAction(Intent.ACTION_SCREEN_OFF); context.getApplicationContext().registerReceiver(this, bcFilter);

unregisterReceiver:

context.getApplicationContext().unregisterReceiver(this);

(就在AppWidgetProvider!)