接口无法强制转换(ClassCastException:AlarmReceiver无法强制转换为AlarmReceiver $ OnAlarmOver)

时间:2016-04-27 18:24:25

标签: java android

我创建了一个警报,我希望当警报停止时可以在MainActivity中将字符串设置为TextView,所以我尝试使用接口但是它会出错:

  

引起:java.lang.ClassCastException:无法将AlarmReceiver强制转换为AlarmReceiver $ OnAlarmOver

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
  public AlarmReceiver() {
  }

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

    ...

    OnAlarmOver onAlarmOver = (OnAlarmOver) context; //<--error
    onAlarmOver.OnAlarmOverText("Alarm stop");        
  }

  public interface OnAlarmOver {
    public void OnAlarmOverText(String overText);
  }
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements AlarmReceiver.OnAlarmOver {

  ...

  public void OnAlarmOverText(String overText){
    alarm_text.setText(overText);
  }
}

我的英语很差,抱歉。

1 个答案:

答案 0 :(得分:0)

您正在尝试将上下文强制转换为OnAlarmOver。当然,这不会起作用。我想你想在你的应用程序内部的其他地方捕获一个广播。

1)您需要定义广播。然后,在您的活动中,您应该注册它。例如:

private BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            if(intent.getAction().equals(SearchService.NOTIFICATION)){

            }
        }
    }
};

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(receiver, new IntentFilter(SearchService.NOTIFICATION));
}

请记住在暂停方法中取消注册

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

2)你需要创建一个Intent并像这样发送广播。

private void publishResults(Search result) {
    Intent intent = new Intent(NOTIFICATION);
    intent.putExtra(RESULT, result);
    sendBroadcast(intent);
    success = true;
}

总而言之,如果由Android提供,我不知道为什么要使用接口(监听器)。也许,你应该多解释一下你想做什么。我希望这个答案可以帮到你。