如何在小部件中收听Intent.ACTION_CONFIGURATION_CHANGED广播?

时间:2014-02-22 19:03:00

标签: android settings autorotate

我开发了一个小部件,其ImageButton可以切换自动旋转设置。一切正常,按下按钮时设置切换。问题是,如果从我的小部件以外的其他来源启用/禁用该设置,我不知道如何列出Intent.ACTION_CONFIGURATION_CHANGED按钮以更改其状态。

我已经阅读了文档,并且我知道我无法在Manifest中注册intent-filter动作android.intent.action.CONFIGURATION_CHANGED,并且必须使用Context.registerReceiver (BroadcastReceiver receiver, IntentFilter filter)动态注册此intent-filter。

我尝试创建一个扩展BroadcastReceiver然后在onUpdate()方法中注册接收器的新类,但它不起作用。

以下是我尝试过的代码:

BroadcastReceiver类:

public class ConfigurationIntentReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
    if(intent.getAction().equals("android.intent.action.CONFIGURATION_CHANGED")){
        if  (android.provider.Settings.System.getInt(context.getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0) == 1){
            remoteViews.setImageViewResource(R.id.widget_autorotate, R.drawable.ic_widget_autorotate_on);
        } else {
            remoteViews.setImageViewResource(R.id.widget_autorotate, R.drawable.ic_widget_autorotate_off);
        }   
        WidgetProvider.pushWidgetUpdate(context.getApplicationContext(), remoteViews);

    }
}
}

这是AppWidgetProvider类:

public class WidgetProvider extends AppWidgetProvider {



@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    context.getApplicationContext().registerReceiver(new ConfigurationIntentReceiver(), new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
    pushWidgetUpdate(context, remoteViews);
}

根据Android的文档,尚未在Manifest中声明ConfigurationIntentReceiver组件。

如果有人能指出我正确的方向,我会非常感激。

1 个答案:

答案 0 :(得分:0)

您只能注册这种意图,因此您将必须通过前台服务(或“活动”,但是这些都会死掉,并且您不想让小部件停止获取它)来完成它。

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