BroadcastReceiver / Widget自定义意图过滤器自行触发

时间:2014-12-30 22:42:37

标签: android widget android-widget broadcastreceiver android-broadcast

我正在尝试创建一个主屏幕窗口小部件,并通过广播从服务(服务尚未实施)定期更新它,下面显示了4个操作字符串。

public final static String BATTERY_UPDATE = "com.app.MyApp.action.BATTERY_UPDATE";
public final static String CPU_UPDATE = "com.app.MyApp.action.CPU_UPDATE";
public final static String SYSTEM_UPDATE = "com.app.MyApp.action.SYSTEM_UPDATE";
public final static String RAM_UPDATE = "com.app.MyApp.action.RAM_UPDATE";

在widget类中,我重写了on receive方法:

@Override
public void onReceive(Context context, Intent intent) {

    switch(intent.getAction()){

        case BATTERY_UPDATE:
            Log.i("Widget", "Battery Update");
            break;

        case CPU_UPDATE:
            Log.i("Widget", "CPU Update");
            break;

        case RAM_UPDATE:
            Log.i("Widget", "RAM Update");
            break;

        case SYSTEM_UPDATE:
            Log.i("Widget", "System Update");
            break;

        case Intent.ACTION_SCREEN_OFF:
            Log.i("Widget", "Screen Off");
            break;
    }
    super.onReceive(context, intent);
}

到目前为止一直很好,但是,只要我在onUpdate方法中向widget添加了intent过滤器,我就会突然开始接收器广播,每隔5秒左右使用我在上面指定的动作字符串,下面是on接收方法

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    Log.i("Widget", "onUpdate");

    Context c = context.getApplicationContext();

    IntentFilter filter1 = new IntentFilter();
    filter1.addAction(Intent.ACTION_SCREEN_OFF);
    filter1.addAction(CPU_UPDATE);
    filter1.addAction(BATTERY_UPDATE);
    filter1.addAction(SYSTEM_UPDATE);
    filter1.addAction(RAM_UPDATE);
    c.registerReceiver(this, filter1);

}

添加的第一个动作(Intent.ACTION_SCREEN_OFF)工作正常,我只在屏幕关闭时收到一个广播,但是其他4个只是继续发射,如果我在清单中指定了这4个动作,也会发生这种情况。有人可以向我解释这里发生了什么,当我从未发送广播时,我如何接收带有定义的动作字符串的广播?

编辑:所以我将编译器合规性级别更改为1.6,我仍然收到广播,这里是编辑后的代码:

@Override
public void onReceive(Context context, Intent intent) {

//  switch(intent.getAction()){
//  
//      case BATTERY_UPDATE:
//          Log.i("Widget", "Battery Update");
//          break;
//          
//      case CPU_UPDATE:
//          Log.i("Widget", "CPU Update");
//          break;
//          
//      case RAM_UPDATE:
//          Log.i("Widget", "RAM Update");
//          break;
//          
//      case SYSTEM_UPDATE:
//          Log.i("Widget", "System Update");
//          break;
//
//      case Intent.ACTION_SCREEN_OFF:
//          Log.i("Widget", "Screen Off");
//          break;
//  }
    Log.i("Widget", intent.getAction());
    super.onReceive(context, intent);
} 

2 个答案:

答案 0 :(得分:1)

仔细查看您的switch声明。你无法打开字符串。 bytecharintshort是您可以开启的唯一内容。

答案 1 :(得分:0)

我刚刚重新启动手机,所有问题现在似乎都已解决