调用BroadcastReceiver onReceive时隐藏UI元素(触发器操作)

时间:2017-10-17 08:38:46

标签: android android-fragments broadcastreceiver

我希望在调用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)'

我做错了什么?

我想要实现的目标:如果计时器到期,请隐藏布局(如果应用程序正在运行)。

0 个答案:

没有答案