2016-04-27 84 views
0

我创建了一个闹钟,我希望当闹钟停止时可以在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

您可以在错误的位置打印'context.getClass()。getName()'到logcat(或toast),并告诉我们结果是什么? – hexafraction

+0

Toast result is android.app.ReceiverRestrictedContext –

+0

因此,在这种情况下,您的上下文不是您的主要活动,因为您的主要活动已关闭时可能会触发警报。报警设计的目的与定时器略有不同。 – hexafraction

回答

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提供。也许,你应该多解释一下你想做什么。我希望这个答案可以帮助你。

相关问题