2016-04-16 11 views
0

Ich habe einen Alarm geplant, um einen Broadcast Reciver zu starten, wenn es Zeit ist und innerhalb der Broadcast-Checks für einige Parameter des Alarmobjekts zu bestimmen, welche Aktivität zu starten .. die App funktioniert finden wenn der Bildschirm eingeschaltet ist, aber wenn der Bildschirm gesperrt ist es funktioniert nichtAktivität wird nicht angezeigt, wenn Alarm ausgelöst

Hier ist, was ich tat:

für Zeitplan -Diese den Alarm

/* Prepare Alarm Intent*/ 
      Intent alarmIntent = new Intent(ctx, LockRoute.class); 
      alarmIntent.putExtra(CONSTANTS.ALARM_NAME, alarm.alarmName); 
      alarmIntent.putExtra(CONSTANTS.ALARM_TONE, alarm.tone); 
      alarmIntent.putExtra(CONSTANTS.ALARM_LOCK_TYPE, alarm.unLockType); 


      //prepare the Pending intent 

      PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, day.getId().intValue(), alarmIntent, 0); 

und das ist die Sendung

/* Pass Alarm Info to unLock Screen*/ 
     alarmRaised.putExtra(CONSTANTS.ALARM_NAME,bundle.getString(CONSTANTS.ALARM_NAME)); 
     alarmRaised.putExtra(CONSTANTS.ALARM_TONE,bundle.getString(CONSTANTS.ALARM_TONE)); 
     alarmRaised.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(alarmRaised); 

Und ich hinzugefügt, um die Fahnen für die Aktivität zu zeigen, wenn das Gerät

pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     Logger.init(); 
     /* Check Device SDK to call the correct Function to TURN ON SCREEN */ 
     if (Build.VERSION.SDK_INT < 20) { 
      if (!pm.isScreenOn()) { 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
         + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
         +WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
         +WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
       Logger.d("less than 20"); 
      }else { 
       Logger.d("SCREEN ON < 20"); 
      } 

     } else { 
      if (!pm.isInteractive()) { 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
         + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
         +WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
         +WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
       Logger.d("bigger = than 20"); 
      }else { 
       Logger.d("SCREEN ON else 20"); 
      } 
     } 

Antwort

0

Ich habe einen Antrag gemacht gesperrt ist, die Zeitpläne ein Alarm, die unabhängig davon klingelt, ob der Bildschirm gesperrt ist oder nicht. Dies kann Ihnen bei Ihrer AlarmReciever.class-Datei helfen.

public class AlarmReceiver extends WakefulBroadcastReceiver { 

@Override 
public void onReceive(final Context context, Intent intent) { 


    //this will sound the alarm tone 
    //this will sound the alarm once, if you wish to 
    //raise alarm in loop continuously then use MediaPlayer and setLooping(true) 
    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    if (alarmUri == null) { 
     alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    } 
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri); 
    ringtone.play(); 

    //this will send a notification message 
    ComponentName comp = new ComponentName(context.getPackageName(), 
      AlarmService.class.getName()); 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
} 

}

und dies rufen Sie in der AlarmActivity.class bearbeiten werden, um Datei

final Intent my_intent = new Intent(AlarmActivity.this, AlarmReceiver.class); 
    Button Alarm_ON = (Button) findViewById(R.id.bu1); 
    Alarm_ON.setOnClickListener(new View.OnClickListener() { 

     @TargetApi(Build.VERSION_CODES.M) 
     @Override 
     public void onClick(View v) { 

      int hour = 0; 
      int minute = 0; 
      int currentApiVersion = android.os.Build.VERSION.SDK_INT; 
      if (currentApiVersion > android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { 

       calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getHour()); 
       calendar.set(Calendar.MINUTE, alarmTimePicker.getMinute()); 

       hour = alarmTimePicker.getHour(); 
       minute = alarmTimePicker.getMinute(); 
      } else { 
       calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour()); 
       calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute()); 

       hour = alarmTimePicker.getCurrentHour(); 
       minute = alarmTimePicker.getCurrentMinute(); 
      } 


      String hour_string = String.valueOf(hour); 
      String minute_string = String.valueOf(minute); 


      if (hour > 12) { 
       hour_string = String.valueOf(hour - 12); 
      } 

      if (minute < 10) { 

       minute_string = "0" + String.valueOf(minute); 
      } 
      //setAlarmText("Alarm set to: " + hour_string + ":" + minute_string); 
      Toast.makeText(getApplicationContext(), "Alarm set to: " + hour_string + ":" + minute_string, Toast.LENGTH_LONG).show(); 
      my_intent.putExtra("extra", "alarm on"); 

      pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this, 0, 
        my_intent, PendingIntent.FLAG_UPDATE_CURRENT); 

      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
        pendingIntent); 

     } 
    }); 

Was wir hier getan haben, ist - 1) Vom Hauptaktivität. Klassendatei Diese AlarmReciever.class-Datei wird aufgerufen und zum geplanten Zeitpunkt wird der Alarm klingeln, egal ob das Telefon gesperrt ist oder nicht.

Haben Sie Fragen, dann antworten Sie hier. :) und vergiss nicht, die Antwort zu akzeptieren, indem du das Häkchen drückst.