Отключить группы радио на определенный период времени (Android)

У меня есть 3 радиогруппы в пользовательском представлении списка. Мне нужно включить первую радиогруппу с 9 утра до 13 часов и отключить после этого. Вторая радиогруппа должна быть включена с 13:00 до 20:00 и отключена после, а третья радиогруппа должна быть включена с 20:00 до 8:00 и отключена после. Как я могу добиться того же ??

BroadCastReceiver.java

public class BackgroundService extends Service {
private static BroadcastReceiver mTickReceiver;

public BackgroundService()
{

}



@Override
public IBinder onBind(Intent arg0)
{
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onCreate()
{
    registerReceiver();
}

@Override
public void onDestroy()
{
    unregisterReceiver(mTickReceiver);
    mTickReceiver = null;
}



private void registerReceiver()
{
    mTickReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)  // this will fire every minute
        {
            String shift = null;
            DateFormat df = new SimpleDateFormat("HH:mm");
            String currentTimeString = df.format(Calendar.getInstance().getTime());
            Log.d("CurrentTime",currentTimeString);
            int currentTime=convertTimeToMinutes(currentTimeString);
            Log.d("CurrentTime1", String.valueOf(currentTime));
            Intent i=new Intent();
            i.setAction("TimeData");

            if(currentTime>=480 && currentTime<780) {
                shift = "Shift1";

            }
           else if(currentTime>=780 && currentTime<1200) {
                shift = "Shift2";


            }
           else if(currentTime>=1200 || currentTime<480) {
                shift = "Shift3";

            }
            Log.d("TAG1",shift);

            intent.putExtra("Shift",shift);

            sendBroadcast(i);


        }
    };
    IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK); // this will broadcast Intent every minute
    registerReceiver(mTickReceiver, filter);
}
private int convertTimeToMinutes(String s) {
    String[] hourMin = s.split(":");
    int hour = Integer.parseInt(hourMin[0]);
    int mins = Integer.parseInt(hourMin[1]);
    int hoursInMins = hour * 60;
    return hoursInMins + mins;
}

}

В методе Activity onCreate я вызываю BroadcastReceiver следующим образом

    Intent i=new Intent(this, BackgroundService.class);
    startService(i);
    IntentFilter filter = new IntentFilter("TimeData");
    registerReceiver(new MyBroadcastReceiver(),filter);

Класс BroadCastReceiver в действии выглядит следующим образом

    class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // GET BROADCAST FROM RECEIVER IN THE BACKGROUND SERVICE CLASS
        Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_SHORT).show();

        Log.d("ActionData",intent.getAction());  // this works, it is checked

        if (intent.getAction() == "TimeData") {
            String shiftValue1= intent.getStringExtra("Shift");
            Log.d("shiftValue1",shiftValue1);
        }
    }
}

Ошибка, которую я получаю, это

вот как вы проверяете время каждую минуту:


person Amit Nair    schedule 16.12.2016    source источник
comment
@Talha Я новичок в Android .. Не могли бы вы помочь мне с некоторыми примерами ??   -  person Talha    schedule 16.12.2016
comment
@Talha .. спасибо за помощь .. Но как я могу проверить текущее время с моим желаемым временем (например, 8 утра) в миллисекундах или около того?   -  person Amit Nair    schedule 16.12.2016


Ответы (2)


Как отправить информацию/данные от получателя в службе в MainActivity , в вашем случае информация для обновления пользовательского интерфейса.

public class BackgroundService extends Service {
    private static BroadcastReceiver mTickReceiver;

    public BackgroundService()
    {

    }



    @Override
    public IBinder onBind(Intent arg0)
    {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onCreate()
    {
        registerReceiver();
    }

    @Override
    public void onDestroy()
    {
        unregisterReceiver(mTickReceiver);
        mTickReceiver = null;
    }



    private void registerReceiver()
    {
        mTickReceiver = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)  // this will fire every minute
            {
                Log.d("TAG", "TICKS");
                // Check current time using getTimeInMilliSeconds() 
               // if time is in your desired range, send UI an intent that it should change radio buttons 

            }
        };
        IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK); // this will broadcast Intent every minute
        registerReceiver(mTickReceiver, filter);
    }

}

В приведенном выше примере я передал данные о местоположении, вы можете передать любую информацию после проверки своего временного диапазона.

ОБНОВЛЕНИЕ:

Используйте SimpleDateFormat для преобразования строки миллисекунд в часы (например, 1481879288 — это «09:08am» (GMT)).

  • Напишите функцию, которая преобразует формат ЧЧ: мм [am/pm] в минуты — «09:08am» в 728 минут или скажите «02:35pm» в 875 минут, это от контрольной точки 00:00, где 12:00 прошло 0 минут. (Hint: break string, convert hours to minutes, add minutes part to converted one, write checks for am/pm) Подсказка за подсказкой. Если вы конвертируете миллисекунды в 24-часовой формат, вы не будете проверять время до и после полудня, просто умножите 60xhourPart и добавите часть минут.

  • Сравните диапазон минут с вашим диапазоном, например. с 08:00 до 20:00 будет от 480 до 12:00 минут, поэтому, если текущее время 09:08, чек будет:

  • Как, если диапазон составляет от 8 вечера до 8 утра (на следующий день происходит)??

     int currentTime=convertTimeToMinutes(currentTimeString);              
    
     // to check if time is between 08:00am to 08:00pm
    
     if(currentTime>=480 && currentTime<=1200) {
    
        Log.d(TAG,"Current time is in between 08:00am to 08:00pm");
    
    }
    

Если это так, используйте проверку, чтобы увидеть, больше ли время 8 вечера или меньше 8 утра, обратите внимание, что здесь проверка || нет &&.

ОБНОВЛЕНИЕ 2

if (currentTime>=1320 || currentTime <=480)
{
// your stuff
}

String сравнение всегда должно производиться методом .equals(), а не ==, так как вы используете ==, строка

никогда не выполняется, вы должны написать это как:

String shiftValue1= intent.getStringExtra("Shift")

ОБНОВЛЕНИЕ 3

if (intent.getAction().equals("TimeData")) {
            String shiftValue1= intent.getStringExtra("Shift");
            Log.d("shiftValue1",shiftValue1);
}

не делай этого:

сделай это:

intent.putExtra("Shift",shift);

Смотрите, вы отправляете тот же объект намерения, который был получен.

i.putExtra("Shift",shift);

Для такого рода функций вы можете либо создать службу таймера, которая проверяет время для определенных периодов времени, либо вы можете использовать службу будильника, которая будет запускаться в определенное время.

person Talha    schedule 16.12.2016
comment
Как, если диапазон составляет от 8 вечера до 8 утра (на следующий день происходит)?? - person Amit Nair; 16.12.2016
comment
Между тем я получаю исключение нулевого указателя на широковещательном приемнике, когда пытаюсь зарегистрировать полученное значение. Мой код представляет собой класс MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive (контекст контекста, намерение намерения) { if (intent.getAction() == TimeData) { String shiftValue1= намерение.getStringExtra (Shift); Log.d(shiftValue1,shiftValue1); } } } - person Amit Nair; 16.12.2016
comment
добавьте код в вопрос и обновите, а также отправьте код, где вы регистрируете получателя с намерением. - person Amit Nair; 19.12.2016
comment
В какой строке именно он бросает NPE? код, кажется, не имеет проблемы. - person Talha; 19.12.2016
comment
Выдает исключение для Log.d(shiftValue1,shiftValue1); - person Talha; 19.12.2016
comment
Извините, нет функции намерения.putStringExtra()... Только намерение.putExtra() - person Amit Nair; 19.12.2016
comment
Давайте продолжим обсуждение в чате. - person Amit Nair; 19.12.2016
comment
НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.rakyow.ehandor, PID: 11492 java.lang.RuntimeException: ошибка при получении широковещательного намерения {act=TimeData flg=0x10} в com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver@1acc203e в android.app. LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:917) на android.os.Handler.handleCallback(Handler.java:815) на android.os.Handler.dispatchMessage(Handler.java:104) на android.os.Looper .loop(Looper.java:194) в android.app.ActivityThread.main(Activ ityThread.java:5576) в java.lang.reflect.Method.invoke(собственный метод) в java.lang.reflect.Method.invoke(Method.java:372) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller. run(ZygoteInit.java:956) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) Вызвано: java.lang.NullPointerException: println требуется сообщение в android.util.Log.println_native(Native Метод) в android.util.Log.d(Log.java:139) в com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver.onReceive(HandoverDetailActivity.java:290) в android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:907) в android.os.Handler.handleCallback(Handler.java :815) на android.os. Handler.dispatchMessage(Handler.java:104) на android.os.Looper.loop(Looper.java:194) на android.app.ActivityThread.main(ActivityThread.java:5576) на java.lang.reflect.Method.invoke (собственный метод) на java.lang.reflect.Method.invoke(Method.java:372) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) на com.android.internal.os .ZygoteInit.main(ZygoteInit.java:751) - person Amit Nair; 19.12.2016

Используйте сервис, который проверяет текущее время с помощью фильтра ACTION_TICK, если текущее время является вашим желаемым временем, отправьте трансляцию для обновления пользовательского интерфейса.

person Lalit Dhameliya    schedule 16.12.2016