BroadcastReceiver not being triggered when app is closed - android

I'm attempting to make it so my app runs some code once per day at 6AM. This works just fine when the app is open and in the foreground, but if the app is closed by swiping it away, the code is never called at the appropriate time.
AlarmReceiver.java (For testing purposes, I have it just trying to display a Toast to verify it runs)
public class AlarmReceiver extends BroadcastReceiver {
public static final String intentAction = "com.mpagliaro98.action.NOTIFICATIONS";
#Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(intentAction)) {
Toast.makeText(context, "RECEIVER CALLED", Toast.LENGTH_LONG).show();
}
}
}
MainActivity.java (Where the alarm is being set)
public class MainActivity extends AppCompatActivity {
...
private void setRecurringAlarm() {
// Set this to run at 6am
Calendar updateTime = Calendar.getInstance();
updateTime.setTimeZone(TimeZone.getDefault());
updateTime.set(Calendar.HOUR_OF_DAY, 6);
updateTime.set(Calendar.MINUTE, 0);
updateTime.set(Calendar.SECOND, 0);
updateTime.set(Calendar.MILLISECOND, 0);
// Build the pending intent and set the alarm
Intent i = new Intent(AlarmReceiver.intentAction);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(),
0, i, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
assert am != null;
am.setRepeating(AlarmManager.RTC, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
}
AndroidManifest.xml (Just the relevant parts)
<uses-permission android:name="android.permission.SET_ALARM" />
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.mpagliaro98.action.NOTIFICATIONS" />
</intent-filter>
</receiver>
I've read through dozens of similar problems to this on this site and elsewhere and I'm seriously at a loss for why this won't work. Any help would be appreciated.

Try changing receiver to
<receiver android:process=":remote" android:name="AlarmReceiver"></receiver>
Should I use android: process =":remote" in my receiver?

Related

Android Service Start is not working when app start?

I am try to set a alarm to restart app on 8:30.am in every day , so I design service and receiver,
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
</receiver>
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)){ //not working ?
Log.d("BootReceiver", "screen on completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if (Intent.ACTION_BOOT_COMPLETED.equals(action)){ //not working ?
Log.d("BootReceiver", "system boot completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if ("startAlarm".equals(intent.getAction())){
Intent home = new Intent(context, MainActivity.class);
home.putExtra("RELOAD",1);
home.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(home);
}
LongRunningService.java
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable(){
#Override
public void run() {
Log.i(TAG, "run: executed at "+ new Date().toString()); //not working?
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
}
In fact , I start service in MainActivity , but I don't want to start service
onCrate in MainActivity , because My alarm set 8:30 to restart MainActivity,
that will be problem , 8:30:00 ~ 8:30:30 will repeat restart my app....
According to docs
Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically
So, if you want receive this broadcast you need to register them during app run (and it will work only if you app not destroyed).
JobScheduler will better fit your needs, i think.

set One time Alarm for certain date and time Android

I want to set One time alarm for certain Date and time. And i also set this by using alarm manager. But My problem is when device switch off and switch on then alarm is not wake up.
My code ::
public void setAlarm(String initialTime, String diffTime) throws ParseException {
Calendar cal = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
cal.set(Calendar.DATE,date);
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.YEAR,year);
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, second);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(ChatScreen.this, AlarmNotificationReceiver.class);
i.putExtra("CoId", coId);
i.putExtra("DeptId", deptNo);
i.putExtra("CoName", companyName);
i.putExtra("DpLogo", dpLogo);
i.putExtra("DeptName",deptName);
i.setAction("isFromAlram");
PendingIntent pi = PendingIntent.getBroadcast(ChatScreen.this,0, i, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),pi);
}
My AlarmReceiverclass :::
public class AlarmNotificationReceiver extends BroadcastReceiver{
#Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.e("AlarmReceiver",action);
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Toast.makeText(context, "ALARM_BOOT_COMPLETED", Toast.LENGTH_LONG).show();
} else if (action.equals("isFromAlram")) {
Logger.errorLog("From Service", "yes");
}
}
}
and also give permission in menifest file android:name="android.permission.RECEIVE_BOOT_COMPLETED"
receiver
android:name="com.chatapi.ChatApi.MyBroadcastReceiver"
android:enabled="true"
EDIT Here the complete manifest entry for the receiver
<receiver android:name=".AlarmNotificationReceiver"
android:enabled="true"
android:process=":remote">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="isFromAlram" > </action>
</intent-filter>
</receiver>
You should add logging to see if your BroadcastReceiver is being called on device boot. Using Toast for this is a bad idea, you may never get to see it. Use logging and check your logcat.
Alarms are not preserved over device boots. When the device boots, your BroadcastReceiver should get called. You then need to set the alarm again.

broadcast receiver works but after 1 or 2 hours it does not work

here is my manifest
<receiver android:name=".MyCallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
and
public class MyCallReceiver extends BroadcastReceiver {
#Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
some code
}
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
some code
}
}
}
it is works but after sometime that press back button and phone be idle it doesn't work any more
(i added "android.os.Process.killProcess(android.os.Process.myPid());" at the end of my code and now it is better and work for maybe 2 3 hour after last execute)
You can use alarm manger to broadcast receiver after certain interval of time like this.
public static void scheduleTestAlarmReceiver(Context context) {
Intent receiverIntent = new Intent(context, TestAlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 123456789, receiverIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+startDelay, someDelay, sender);
}

AlarmManager not working in Fragment nor in Main.java

I HAVE to be missing something, I made a test Application Project for myself and this works perfectly there but when I tried to implement my AlarmManager into my main project's fragment it just won't work. Here's my code:
The Method that is in my fragment:
public void schedule()
{
Long time = new GregorianCalendar().getTimeInMillis()+10*1000;
Intent intent = new Intent(getActivity(), AlarmReceiver.class);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 10*1000, PendingIntent.getBroadcast(getActivity(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
}
and here is my AlarmReceiver.class
public class AlarmReceiver extends BroadcastReceiver {
#Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();
}
}
And also here are the preparations in my Manifest file:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<application
... >
<receiver android:name=".AlarmReceiver"/>
What am I doing wrong?
Note: It seems that it doesn't even reach the AlarmReceiver
Your code seems to work.
But it the problem is the manifest. the
<receiver android:name=".AlarmReceiver"/>
should be the with the full package name, for example
<receiver android:name="com.example.AlarmReceiver"/>
I've double check it with my app. so you are good to go.
You are using the receiver incorrectly. What you need to do first is to add an action to your receiver's manifest
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="com.example.action.ALARM" />
</intent-filter>
Then, construct the intent with that action:
public void schedule() {
Long time = new GregorianCalendar().getTimeInMillis()+10*1000;
Intent intent = new Intent("com.example.action.ALARM");
...
}
and in your receiver:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.example.action.ALARM")
Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();
}
This should do the trick.

Android alarm not being triggered

I"m sure this is something that is simple, but I'm not figuring it out. I'm trying to make a simple repeating alarm and it never gets triggered. What I have is:
private void setupAlarms()
{
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, RepeatingAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(HelloAndroid.this, 0, intent, 0);
GregorianCalendar fifteenSeconds = (GregorianCalendar)Calendar.getInstance();
fifteenSeconds.add(Calendar.MINUTE, 0);
fifteenSeconds.set(Calendar.SECOND, 15);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), fifteenSeconds.getTimeInMillis(), pendingIntent);
}
This is called from the main onCreate call.
My alarm receiver:
public class RepeatingAlarm extends BroadcastReceiver
{
#Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, R.string.hello, Toast.LENGTH_SHORT).show();
}
}
In my manifest, I have added:
<receiver android:name=".RepeatingAlarm" android:process=":remote" />
Any help, much appreciated
Have you added an intent filter to your BroadcastReceiver?
Code might look something like this in your AndroidManifest.xml file:
<receiver android:name=".RepeatingAlarm" android:exported="true">
<intent-filter>
<action android:name="intent id text" />
</intent-filter>
</receiver>
and when creating your intent do something like this:
Intent intent = new Intent("intent id text")
where the "intent id text" can be any string you use to identify your intent. Also Android alarms get reset if you reboot your device so that may be something you need to look into.
Hope this helps.

Categories

Resources