使用BroadcastReceiver更新活动的Activity UI

San*_*go 0 android android-intent android-broadcast

我使用以下示例实现了重复报警

但是,一旦警报"熄灭"/收到警报,我想ListView在活动状态中更新我的警报.我只有一个活动ListView.

收到警报后,如何在主活动类中执行更新UI方法?你如何onReceive()AlarmReceiver(extends BroadcastReceiver)类中调用它

And*_*nko 9

最简单的方法是使您的AlarmReceiver成为您活动的内部类.这样,它就可以访问您活动的所有字段和方法.如果你不在其他任何地方使用它,它也可能是匿名的.要使其仅在活动时更新您的活动,请注册您的接收器onResume()并取消注册onPause().请注意IntentFilterBroadcastReceiver将响应的指定意图操作.

例:

private BroadcastReceiver updateReceiver;

//...

@Override
protected void onResume() {
    super.onResume();

    updateReceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //your list update code here
        }
    };
    IntentFilter updateIntentFilter=new IntentFilter("update");
    registerReceiver(updateReceiver, updateIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();

    if (this.updateReceiver!=null)
        unregisterReceiver(updateReceiver);
}
Run Code Online (Sandbox Code Playgroud)

如果您仍希望AlarmReceiver成为一个单独的类,请在初始化期间向其传递某种回调:

public interface AlarmReceiverCallback {
    public void onAlarmReceived(Intent intent);
}

//in your AlarmReceiver class:
private AlarmReceiverCallback callback;

public AlarmReceiver(AlarmReceiverCallback callback) {
    this.callback=callback;
}

@Override
public void onReceive(Context context, Intent intent) {
    callback.onAlarmReceived(intent);
}
Run Code Online (Sandbox Code Playgroud)

初始化您的AlarmReceiver遗嘱将采用以下方式:

updateReceiver=new AlarmReceiver(new AlarmReceiverCallback() {
    @Override
    public void onAlarmReceived(Intent intent) {
        //your list update code here
    }     
});
Run Code Online (Sandbox Code Playgroud)