我希望在调用onReceive()
的{{1}}时隐藏我的主要活动中的UI元素。
广播接收器:
清单
BroadcastReceiver
代码
receiver android:name=".ProcessTimerReceiver"
点击按钮:
public class ProcessTimerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
// call function
}
}
}
必须在应用关闭时运行。
当调用onReceive动作时,我想隐藏片段中的UI元素(如果应用正在运行),但我不知道如何从BroadcastReceiver到达片段的元素。
请帮帮我。谢谢!
UPDATE1:
ProcessTimerReceiver
Intent alarmIntent = new Intent(getActivity(), ProcessTimerReceiver.class);
alarmIntent.setAction(ProcessTimerReceiver.ACTION_ALARM_RECEIVER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(),
REQUEST_CODE_ALARM, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
使用此接收器的重要功能:
TimerTabbedActivity
public class ProcessTimerReceiver extends BroadcastReceiver {
private Helper helper;
private AudioManager audioManager;
private Vibrator v;
private long[] pattern_normal = {100, 300, 100, 300, 100, 300};
public static final String ACTION_ALARM_RECEIVER = "ACTION_ALARM_RECEIVER";
private static final int MUTE_NOW_NORMAL_AT = 0;
private static final int NORMAL_NOW_MUTE_AT = 1;
private static final int MUTE_NOW_NORMAL_IN = 2;
private static final int NORMAL_NOW_MUTE_IN = 3;
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if (ACTION_ALARM_RECEIVER.equals(intent.getAction())) {
helper = new Helper(context);
audioManager = (AudioManager) context.getSystemService(AUDIO_SERVICE);
v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
switch (helper.getTimerMode()){
case -1:
helper.logD("Error while setting timer! (getTimerMode = -1)");
break;
case MUTE_NOW_NORMAL_AT:
helper.logD("MUTE_NOW_NORMAL_AT" + " RingerMode: " + audioManager.getRingerMode());
helper.setToTimerNormalMode();
break;
case NORMAL_NOW_MUTE_AT:
helper.logD("NORMAL_NOW_MUTE_AT" + " RingerMode: " + audioManager.getRingerMode());
helper.setToTimerVibrateMode();
break;
case MUTE_NOW_NORMAL_IN:
helper.logD("MUTE_NOW_NORMAL_IN" + " RingerMode: " + audioManager.getRingerMode());
helper.setToTimerNormalMode();
break;
case NORMAL_NOW_MUTE_IN:
helper.logD("NORMAL_NOW_MUTE_IN" + " RingerMode: " + audioManager.getRingerMode());
helper.setToTimerVibrateMode();
break;
}
}
}
}
}
因为这些函数,主要是因为PendingIntent的使用我不知道如何以编程方式注册接收器,以及如何重写这些函数 - 并且如果接收器被定义,也不确定如何注册它在它的'单独的类(单独的.java文件)。
我想在从ProcessTimerReceiver调用onReceive时隐藏clAdvanced ConstraintLayout。
UPDATE2:
我尝试以下列方式执行此操作,但它仍无效:
public class TimerTabbedActivity extends Fragment {
private int REQUEST_CODE_ALARM = 1001;
private ConstraintLayout clAdvanced;
//...
private void createAlarm() {
Intent alarmIntent = new Intent(getActivity(), ProcessTimerReceiver.class);
alarmIntent.setAction(ProcessTimerReceiver.ACTION_ALARM_RECEIVER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), REQUEST_CODE_ALARM, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//...
}
public void cancelAlarm() {
Intent alarmIntent = new Intent(getActivity(), ProcessTimerReceiver.class);
alarmIntent.setAction(ProcessTimerReceiver.ACTION_ALARM_RECEIVER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), REQUEST_CODE_ALARM, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//...
}
private boolean checkForAlarm() {
Intent alarmIntent = new Intent(getActivity(), ProcessTimerReceiver.class);
alarmIntent.setAction(ProcessTimerReceiver.ACTION_ALARM_RECEIVER);
boolean bIsAlarmWorking = PendingIntent.getBroadcast(getActivity(), REQUEST_CODE_ALARM, alarmIntent, PendingIntent.FLAG_NO_CREATE) != null;
helper.logD("Alarm is" + (bIsAlarmWorking ? "" : " NOT") + " working");
return bIsAlarmWorking;
}
}
现在它说,
引起:java.lang.NullPointerException:尝试调用虚拟 null对象引用上的方法'void logD(java.lang.String)'
我做错了什么?
我想要实现的目标:如果计时器到期,请隐藏布局(如果应用程序正在运行)。