I have 3 Radio Groups in a custom list view. I need to enable the first radio group from morning 9 to 1 pm and disable after that. Second radio group to be enable from 1 pm to 8 pm and disable after and third radio group to be enabled from 8 pm to 8 am and disable after. How can I achieve the same ??
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;
}
}
In Activity onCreate method I am calling BroadcastReceiver as following
Intent i=new Intent(this, BackgroundService.class);
startService(i);
IntentFilter filter = new IntentFilter("TimeData");
registerReceiver(new MyBroadcastReceiver(),filter);
BroadCastReceiver Class in Activity is as follows
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);
}
}
}
Error I am getting is
FATAL EXCEPTION: main Process: com.rakyow.ehandor, PID: 11492 java.lang.RuntimeException: Error receiving broadcast Intent { act=TimeData flg=0x10 } in com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver@1acc203e at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:917) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5576) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) Caused by: java.lang.NullPointerException: println needs a message at android.util.Log.println_native(Native Method) at android.util.Log.d(Log.java:139) at com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver.onReceive(HandoverDetailActivity.java:290) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:907) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5576) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
this is how you check time every minute:
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);
}
}
How to send info/data from a receiver in a service to MainActivity, in your case info to update UI.
In above example I passed location data, you can pass any information once you checked your time range.
UPDATE:
Use SimpleDateFormat
to convert milliseconds to hours string (e.g. 1481879288 is "09:08am" (gmt)).
Write a function that convert HH:mm [am/pm] format into minutes - "09:08am" into 728 minutes, or say "02:35pm" to 875 minutes, this is from 12:00am reference point where 12:00am is 0 minutes elapsed. (Hint: break string, convert hours to minutes, add minutes part to converted one, write checks for am/pm)
Hint for hint - if you convert milliseconds to 24-hour format, you will avoid check for am/pm, simply multiply 60xhourPart and add minutes part.
Compare minutes range with your range e.g. from 08:00am to 08:00pm, it will be 480 minutes to 1200 minutes, so if current time is 09:08am the check will be :
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");
}
How if the range is between 8pm-8am(Next day happens)??
If that's the case, use check to see if time is greater than 8pm or it is lower than 8am , notice here check is || not &&.
if (currentTime>=1320 || currentTime <=480)
{
// your stuff
}
UPDATE 2
String
comparison must always be with .equals()
method not ==
, since you use ==
, the line
String shiftValue1= intent.getStringExtra("Shift")
never executes, you should write it as :
if (intent.getAction().equals("TimeData")) {
String shiftValue1= intent.getStringExtra("Shift");
Log.d("shiftValue1",shiftValue1);
}
UPDATE 3
dont do this:
intent.putExtra("Shift",shift);
do this:
i.putExtra("Shift",shift);
See you are sending same intent object that was received.