Android notifications after "all app close" button - android

I am using notifications in my application and everything works well - the notification is showing at desired time to me, even after device reboot.
However, when I click the special button to close all apps, so it closes my app, the notification is not showing at all.
"The special button to close all apps" - I mean the one where you can list all the background apps and then with one click kill them all.
I am testing everything on OnePlus 3T.
Is it possible to run the service again after that "kill all apps" click ?
manifest:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver
android:name="com.saga.thewitcherquotes.QuoteOfTheDayReceiver"
android:enabled="true"
android:exported="false" >
</receiver>
<receiver android:name="com.saga.thewitcherquotes.DeviceBootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.saga.thewitcherquotes.QuoteOfTheDayIntentService"
android:exported="false"></service>
BootReceiver:
public class DeviceBootReceiver extends BroadcastReceiver {
#Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
// on device boot compelete, reset the alarm
Intent alarmIntent = new Intent(context, QuoteOfTheDayReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar current = Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 21);
calendar.set(Calendar.MINUTE, 30);
if(calendar.before(current))
{
calendar.add(Calendar.DATE, 1);
}
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
}
}
}
The service with notification builder:
public class QuoteOfTheDayIntentService extends IntentService {
private static final int NOTIFICATION_ID = 3;
public QuoteOfTheDayIntentService() {
super("MyNewIntentService");
}
#Override
protected void onHandleIntent(Intent intent) {
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle(getString(R.string.quote_of_the_day));
DatabaseHandler db = DatabaseHandler.getInstance(this);
Random generator = new Random();
int id = generator.nextInt(db.getQuotesSize());
Quote quote = db.getQuote(id, null);
builder.setContentText(quote.getQuote());
builder.setSmallIcon(R.drawable.swords);
builder.setAutoCancel(true);
Intent notifyIntent = new Intent(this, MainActivity.class);
notifyIntent.putExtra("id",id-1);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
Notification notificationCompat = builder.build();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
managerCompat.notify(NOTIFICATION_ID, notificationCompat);
}
}

Related

Daily notification cannot start after installing

I'm developing an android application that have daily notification. I have a solution but not enough. My code working after restarting the phone. Users will not restart their devices unless they are required. My notifications will not appear until this time. How can I solve?
BootReceiver.java
public class BootReceiver extends BroadcastReceiver {
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
#Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Device Booted", Toast.LENGTH_SHORT).show();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 20);
calendar.set(Calendar.SECOND, 0);
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, 1, alarmIntent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
}
Manifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".AlarmReceiver" />
<receiver
android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
AlarmReceiver.java -> just notification builder

Sending Notifications at Pre-defined Time Not Working

I read several questions here, and have a similar one as well. Non of the answers on another questions manage to solve the issue unfortunately. I know how to create a notification on Button click, yet I failed to create a notification for a specific time. My goal in the following code snippet was to create a notification at 19:00 every day. Here is the code snippet:
MainActivity:
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = Calendar.getInstance();
setAlarm(calendar);
}
public void setAlarm(Calendar calendar) {
Intent alertIntent = new Intent(this, Receiver.class);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, alertIntent, 0);
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 00);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
24*60*60*1000, pendingIntent);
}
Receiver:
public class Receiver extends BroadcastReceiver{
#Override
public void onReceive(Context context, Intent intent) {
createNotification(context, "Blabla", "Blablablabla", "Alert");
}
public void createNotification(Context context, String msg,
String msgText, String msgAlert) {
PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.clear_dayicon)
.setContentTitle(msg)
.setContentText("msgText")
.setTicker(msgAlert);
mBuilder.setContentIntent(pi);
mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
}
}
Manifest:
// only ones I called after started working with notifications and stuff
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name=".Receiver2" android:enabled="true">
<intent-filter> <action android:name="NOTIFICATION_SERVICE" /></intent-filter>
</service>
<receiver android:name=".Receiver"/>
Some help would be super appreciated. Since I'm a beginner, I need someone to show me my mistakes. Otherwise, I can't spot them no matter how many docs I read. This code looks fine to me :P
try this:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 00);
setAlarm(calendar);
}
public void setAlarm(Calendar calendar) {
boolean alarmNoActive = (PendingIntent.getBroadcast(this, 0, new Intent("ALARM"), PendingIntent.FLAG_NO_CREATE) == null);
if(alarmNoActive){
Intent itAlarm = new Intent("ALARM");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,itAlarm,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
AlarmManager alarme = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
24*60*60*1000, pendingIntent);
}
}
In the manifest put this permission:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
In application:
<receiver
android:name="path of the BroadcastReceiver.Receiver"
android:label="BroadcastReceiverAux">
<intent-filter>
<action android:name="ALARM" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

Android Scheduled Notification not working

I am building an android app to display recurring scheduled notification at a specified time of the day.
For this I have created broadcastReceiver using following code:
public class ScheduleNotification extends BroadcastReceiver {
public static final int NOTIFICATION_ID = 1;
#Override
public void onReceive(Context context, Intent intent) {
long when = System.currentTimeMillis();
MainActivity mainActivity = new MainActivity();
String _pasuram_number = mainActivity.get_pasuram_number();
String[] _pasuram_str = mainActivity.get_dd_text(_pasuram_number).split(",");
Log.d("VC", "Notification intent paasuram " + _pasuram_number);
intent.putExtra("pasuramnumber", _pasuram_number);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent snoozeIntent = new Intent(context, MainActivity.class);
PendingIntent piSnooze = PendingIntent.getService(context, 0, snoozeIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.ic_stat_name);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_stat_name));
builder.setContentTitle("Title of the notification");
builder.setContentText(_pasuram_str[9]+"-"+_pasuram_str[11]);
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(_pasuram_str[0] + "-" + _pasuram_str[8]));
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
}
In the MainActivity added code to create alarm
private void createScheduledNotification(int days)
{
// Get new calendar object and set the date to now
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// Add defined amount of days to the date
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
//calendar.add(Calendar.HOUR_OF_DAY, days * 24);
// Retrieve alarm manager from the system
AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(getBaseContext().ALARM_SERVICE);
// Every scheduled intent needs a different ID, else it is just executed once
int id = (int) System.currentTimeMillis();
// Prepare the intent which should be launched at the date
Intent intent = new Intent(this, ScheduleNotification.class);
// Prepare the pending intent
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Register the alert in the system. You have the option to define if the device has to wake up on the alert or not
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
//alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
The code compiles fine and application runs, but scheduled notification does not appear as expected.
In the manifest file added receiver as follows:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.vaishnavism.eclass.dinamorudivyaprabandam" >
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<!-- permission required to use Alarm Manager -->
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<!-- Register the Alarm Receiver -->
<receiver android:name="com.vaishnavism.eclass.dinamorudivyaprabandam.ScheduleNotification"/>
<activity
android:name=".MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SettingsActivity"
android:label="#string/title_activity_settings"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.vaishnavism.eclass.dinamorudivyaprabandam.MainActivity" />
</activity>
</application>
</manifest>
Any help to resolve the issue is greatly appreciated.
Thanks
Try to use set your alarm like below :
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
int interval = 1000 * 60 * 60 * 24;
Intent myIntent = new Intent(yourActivity.this, ScheduleNotification .class);
pendingIntent = PendingIntent.getBroadcast(UserDashBoardActivity.this, 0, myIntent,0);
/* Repeating on every 24 hours interval */
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent);
And you need to start an Alarm When the Device Boots.
For more info refere here.
Hope it will help you.

notification stopped when the device is rebooted in monodroid

i'm trying to use notification in my application in monodroid
the code that i wrote works well but when i reboot the device, the notification stopped and an alert pops up and says "Unfortunately app-name has stopped"
i really don't know how to solve it. please help. thanks
main activity :
Calendar calendar = Calendar.GetInstance(Java.Util.TimeZone.Default);
calendar.Set(Calendar.Year, DateTime.Now.Year);
calendar.Set(Calendar.Month, DateTime.Now.Month);
calendar.Set(Calendar.DayOfYear, DateTime.Now.DayOfYear);
calendar.Set(Calendar.HourOfDay,12);
calendar.Set(Calendar.Minute, 00);
calendar.Set(Calendar.Second, 00);
calendar.Set(Calendar.Millisecond, 00);
NotificationReceiver Notifications = new NotificationReceiver();
Notifications.StartNotify(this, calendar.TimeInMillis);
manifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="15" />
<!-- Permission to start Alarm on device reboot -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:allowBackup="true" android:icon="#drawable/LogoLifeTime" android:label="#string/ApplicationName" android:theme="#style/AppTheme">
<activity android:name=".Main_Activity" android:label="#string/ApplicationName"></activity>
<receiver android:name=".NotificationReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<!-- Will not be called unless the application explicitly enables it -->
<receiver android:name=".DeviceBootReceiver" android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
notificationreceiver :
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
class NotificationReceiver : BroadcastReceiver
{
PowerManager.WakeLock w1;
public override void OnReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager)context.GetSystemService(Context.PowerService);
w1 = pm.NewWakeLock(WakeLockFlags.Partial, "NotificationReceiver");
w1.Acquire();
CreateNotification(context);
w1.Release();
}
void CreateNotification(Context context)
{
var nMgr = (NotificationManager)context.GetSystemService(Context.NotificationService);
var notification = new Notification(Resource.Drawable.LogoLifeTime, "LTP");
var pendingIntent = PendingIntent.GetActivity(context, 0, new Intent(context, typeof(check_daily_tasks_activity)), PendingIntentFlags.OneShot);
notification.SetLatestEventInfo(context,"hello dear", pendingIntent);
notification.Defaults |= NotificationDefaults.Sound | NotificationDefaults.Vibrate | NotificationDefaults.Lights;
notification.Flags = NotificationFlags.ShowLights | NotificationFlags.AutoCancel;
notification.LedARGB = Color.Blue;
notification.LedOnMS = 1;
notification.LedOffMS = 1;
nMgr.Notify(0, notification);
}
public void StartNotify(Context context, long alertTime)
{
AlarmManager am = (AlarmManager)context.GetSystemService(Context.AlarmService);
Intent intent = new Intent(context, this.Class);
PendingIntent pi = PendingIntent.GetBroadcast(context, 0, intent, 0);
am.SetRepeating(AlarmType.RtcWakeup, alertTime, AlarmManager.IntervalDay, pi);
}
}
DeviceBootReceiver :
[BroadcastReceiver]
public class DeviceBootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action.Equals("android.intent.action.BOOT_COMPLETED"))
{
Calendar calendar = Calendar.GetInstance(Java.Util.TimeZone.Default);
calendar.Set(Calendar.Year, DateTime.Now.Year);
calendar.Set(Calendar.Month, DateTime.Now.Month);
calendar.Set(Calendar.DayOfYear, DateTime.Now.DayOfYear);
calendar.Set(Calendar.HourOfDay, 12);
calendar.Set(Calendar.Minute, 00);
calendar.Set(Calendar.Second, 00);
calendar.Set(Calendar.Millisecond, 00);
NotificationReceiver Notifications = new NotificationReceiver();
Notifications.StartNotify(context, calendar.TimeInMillis);
Intent alarmIntent = new Intent(context, typeof(NotificationReceiver));
PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager)context.GetSystemService(Context.AlarmService);
manager.SetInexactRepeating(AlarmType.RtcWakeup, calendar.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
Toast.MakeText(context, "Alarm Setsds", ToastLength.Short).Show();
}
}
}
I had a similar problem: if i closed the app through a task manager, the BroadcastReceivers stopped working. You try to build app in release mode sign app and publish in Ad-Hoc Distribution
Good Luck.

alarm reminder not working

I am trying to create reminder using alarm manager. But seems it's not working. I am trying to set multiple reminder using different id but my broadcastreceiver not getting called. I am not seeing any notification or nor any sound.
I have tried 30-40 times.
I am setting date to calender like 25/11/2014
Here is myactivity code which setting alarm notification.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2014);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DAY_OF_MONTH, 25);
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 30);
//calendar.set(Calendar.SECOND, 1);
Intent myIntent = new Intent(CreateReminder.this, MyReceiver.class);
myIntent.putExtra("reminder_id",reminderid);
myIntent
.setAction("com.sandeep.alarm.REMINDER");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
CreateReminder.this, reminderid, myIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent);
MyReceiver.class
public class MyReceiver extends BroadcastReceiver {
private Ringtone r;
#SuppressWarnings("deprecation")
#Override
public void onReceive(Context context, Intent intent) {
int ID=intent.getExtras().getInt("reminder_id");
Log.i("CreateReminder", "reminder_id:-"+ID);
int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, "reminder", when);
String title = context.getString(R.string.app_name);
String subTitle = "Please complete task";
Intent notificationIntent = new Intent(context, ReminderActivity.class);
notificationIntent.putExtra("reminder_id", ID);
PendingIntent intent1 = PendingIntent.getActivity(context, 0,notificationIntent, 0);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
notification.setLatestEventInfo(context, title, subTitle, intent1);
//To play the default sound with your notification:
//notification.defaults |= Notification.DEFAULT_SOUND;
notification.flags |= Notification.FLAG_INSISTENT;
//notification.defaults |= Notification.;
notificationManager.notify(0, notification);
Uri notification1 = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
r = RingtoneManager.getRingtone(context, notification1);
r.play();
new Handler().postDelayed(new Runnable(){
public void run() {
r.stop();
}
}, 10000);
}
}
I am registering my receiver in AndroidManifest.xml with permissions.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="com.sandip.remindme.CreateReminder"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.sandip.remindme.ReminderActivity"></activity>
<receiver android:name="com.sandip.remindme.MyReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.sandeep.alarm.REMINDER" />
</intent-filter>
</receiver>
</application>
I don't understand why it's not working. Please give me some hints or reference.
You are not sending your broadcast after you set your action in your intent.
Intent myIntent = new Intent(CreateReminder.this, MyReceiver.class);
myIntent.putExtra("reminder_id",reminderid);
myIntent
.setAction("com.sandeep.alarm.REMINDER");
sendbroadcast(myIntent);//YOU FORGOT TO ADD THIS
I have compared your code to mine and have a couple of things for you to try...
Is com.sandeep.alarm a real namespace? The activities within your app have the differing namespace com.sandip.remindme so you could use this ("com.sandip.remindme.REMINDER") for your action name.
Your intent is created with a specific context and class target. Try constructing it with just the action name, then you will know if the action name is the issue:
Intent myIntent = new Intent("com.sandip.remindme.REMINDER")
I'm also working on Alarm remainder and I've implemented successfully in my app. you can download the example code in the following link. I hope it helps you. Please note that alarm takes 30secs to 1 min to call broadcast receiver. i.e., if you set alarm at 3:30:00pm then broad cast receiver will be called at around 3:30:30pm.
https://www.dropbox.com/s/t2m5ph8s8f17v6m/AndroidAlarmManager.zip?dl=0
Thanks
Ramesh
You're never sending the broadcast.
sendbroadcast(myIntent);
Add that directly after you do .setAction, and the code should work just fine.

Categories

Resources