I'm struggling with this problem for days... I have an app setting some alarms. When an alarm is triggered, an Activity showing a message must show, playing a sound and vibrating. When the device is connected with the USB cable to my PC, everything works. Instead, when the phone is not plugged and it goes in sleep mode, even if the alarms are triggered at the right time and the screen correctly turns on, the message Activity seems to just start for a millisecond with sound and vibration, and then it gets immediately killed. What am I missing? I set the alarms with AlarmClock in order to avoid the known sleep/doze mode problems, and I turn back on the screen from sleep mode by using some deprecated PowerManager methods. Maybe am I missing some permission in Manifest file, or am I wrong with the flags I add to the intent opening the activity? This is my code:
Manifest permissions:
<!-- Needs internet to connect to Google Services -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Permission to check internet connection state -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- Keeps processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- Permission to vibrate when receive a notification -->
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- Lets app receive data messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<!-- Permission to set alarms again when device is rebooted -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- Permission to disable the keylock -->
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
....
<receiver android:name=".alarm.PrescrizioneAlarmBroadcastReceiver"/>
AlarmSettingManager:
public class AlarmSettingManager
{
private Context context;
private DBManager dbManager = null;
final int DAYS_BETWEEN_PILLS = 1;
// Constructor
public AlarmSettingManager(Context c)
{
context = c;
dbManager = new DBManager(context);
}
private class PrescriptionAlarmSetter extends AsyncTask<String, Void, Boolean>
{
@Override
protected Boolean doInBackground(String... strings)
{
Intent alarmIntent = new Intent(context, PrescrizioneAlarmBroadcastReceiver.class);
String text = "This is the message";
// put the RequestCode ID as intent's extra, in order to identify which alarm is triggered
alarmIntent.putExtra("request_code", currentID);
alarmIntent.putExtra("title", "Assumere compressa");
alarmIntent.putExtra("text", text);
alarmIntent.putExtra("id_prescrizione", prescrizione.getId_prescrizione());
alarmIntent.putExtra("id_farmaco", prescrizione.getId_farmaco());
alarmIntent.putExtra("numero_pasticche", prescrizione.getNumero_pasticche());
PendingIntent pendingIntent = PendingIntent.getBroadcast
(
context.getApplicationContext(),
currentID,
alarmIntent,
PendingIntent.FLAG_CANCEL_CURRENT
);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, prescrizione.getIntHour());
calendar.set(Calendar.MINUTE, prescrizione.getIntMinutes());
calendar.set(Calendar.SECOND, 0);
// if for today the time is passed already
if(calendar.getTimeInMillis() < System.currentTimeMillis())
{
// set the alarm for the next day (add one day)
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), pendingIntent);
alarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
return true;
}
@Override
protected void onPostExecute(Boolean b)
{
super.onPostExecute(b);
}
}
public boolean setPrescriptionAlarms()
{
AlarmSettingManager.PrescriptionAlarmSetter prescriptionAlarmSetter = new AlarmSettingManager.PrescriptionAlarmSetter();
prescriptionAlarmSetter.execute();
return true;
}
}
PrescrizioneAlarmBroadcastReceiver:
public class PrescrizioneAlarmBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent receivedIntent)
{
int request_code = receivedIntent.getIntExtra("request_code", -1);
String title = receivedIntent.getStringExtra("title");
String text = receivedIntent.getStringExtra("text");
int id_farmaco = receivedIntent.getIntExtra("id_farmaco", -1);
int id_prescrizione = receivedIntent.getIntExtra("id_prescrizione", -1);
int numero_pasticche = receivedIntent.getIntExtra("numero_pasticche", -1);
// Take the first 4 digits of the request code as a String
String requestCodePrefix = Integer.toString(request_code).substring(0, 4);
if(request_code != -1)
{
if(requestCodePrefix.equals(Constants.PRESCRIZIONE_ALARM_PREFIX) || requestCodePrefix.equals(Constants.SNOOZED_PRESCRIZIONE_ALARM_PREFIX))
{
// Wake device from sleep mode
PowerManager pm = (PowerManager) context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();
//to release the screen lock
KeyguardManager keyguardManager = (KeyguardManager) context.getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
Intent intent = new Intent(context, PrescrizioneAlarmReceiverActivity.class);
intent.putExtra("request_code", request_code);
if(title != null && text != null)
{
intent.putExtra("title", title);
intent.putExtra("text", text);
}
intent.putExtra("id_farmaco", id_farmaco);
intent.putExtra("id_prescrizione", id_prescrizione);
intent.putExtra("numero_pasticche", numero_pasticche);
// ARE THESE FLAGS OK???
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
}
}
}
}
PrescrizioneAlarmReceiverActivity (the activity that gets closed):
public class PrescrizioneAlarmReceiverActivity extends AppCompatActivity
{
SoundManager soundManager;
VibrationManager vibrationManager;
DBManager dbManager;
TextView alarmTitle, alarmText;
Button snoozeButton, stopButton;
String title, text;
int id_farmaco, id_prescrizione, numero_pasticche;
boolean okClicked;
int request_code = -1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
dbManager = new DBManager(getApplicationContext());
vibrationManager = VibrationManager.getInstance(getApplicationContext());
soundManager = SoundManager.getInstance(getApplicationContext());
// Vibrate
vibrationManager.startVibration();
// Play sound
soundManager.playSound();
setOkClicked(false);
// Set Activity fullscreen
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// let the window be shown when the screen is locked and the keyguard will be dismissed
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
// Turn the device's screen on and keep it turned on and bright
// as long as this window is visible to the user
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_prescrizione_alarm_receiver);
// Reference all Views of the Activity
alarmTitle = (TextView) findViewById(R.id.alarm_title_prescription);
alarmText = (TextView) findViewById(R.id.alarm_text_prescription);
snoozeButton = (Button) findViewById(R.id.snooze_alarm_prescription_button);
stopButton = (Button) findViewById(R.id.stop_alarm_prescription_button);
Bundle extras = getIntent().getExtras();
title = extras.getString("title");
text = extras.getString("text");
id_farmaco = extras.getInt("id_farmaco");
id_prescrizione = extras.getInt("id_prescrizione");
numero_pasticche = extras.getInt("numero_pasticche");
request_code = extras.getInt("request_code");
alarmTitle.setText(title);
alarmText.setText(text);
// Set all listeners
snoozeButton.setOnClickListener(new SnoozeAlarmButtonClickListener());
stopButton.setOnClickListener(new PrescrizioneStopAlarmButtonClickListener());
}
@Override
protected void onPause()
{
AlarmSettingManager alarmSettingManager = new AlarmSettingManager(getApplicationContext());
// Se ho cliccato su stop
if(okClicked)
{
// Set the alarm to trigger again in 1 day
alarmSettingManager.setPrescriptionAlarms();
}
super.onPause();
}
@Override
protected void onStop()
{
super.onStop();
// Get redirected to another Activity
Intent intent = new Intent(this, SplashActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
Thanks.