Guten Morgen!
Seit einiger Zeit versuche ich nun schon einen art Wecker zu implementieren.
Dabei geht es mir primär darum, dass mein Handy um einer bestimmten Uhrzeit, etwas tun soll (Sound abspielen etc.).
Beim suchen nach einer Lösung bin ich oft auf den AlarmManager gestoßen, welcher man scheinbar nutzen soll, sofern man etwas bei einer bestimmten Uhrzeit machen möchte.
Leider scheitere ich, auch nach Ausprobieren mehrerer Tutorials, Beispielen etc. daran, diesen "richtig" zu verwenden.
Nach einigen Versuchen stehe ich nun wieder vor der unten stehenden rudimentären Implementierung, welche zumindest so lange funktioniert, bis der User das Gerät sperrt.
Da ich aber auch bei gesperrten Bildschirm "geweckt" werden möchte, bringt mir es kaum etwas.
Nun hoffe ich, dass ihr mir bei meinem Problem helfen oder mir eine alternative Vorgehensweise aufzeigen könnt.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.anluin.syncadapter">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".AlarmService"
android:exported="false" />
<receiver
android:name=".AlarmReceiver"
android:process=":remote" />
</application>
</manifest>
Alles anzeigen
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//checking if alram is working with pendingIntent
if (isActive()) {
Toast.makeText(this, "Alarm is Active", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Alarm is Deactive", Toast.LENGTH_SHORT).show();
startAlarm();
}
}
private void startAlarm() {
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
intent.setAction(AlarmReceiver.ACTION_ALARM_RECEIVER);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 50);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, 0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
private boolean isActive() {
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
intent.setAction(AlarmReceiver.ACTION_ALARM_RECEIVER);
return PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, PendingIntent.FLAG_NO_CREATE) != null;
}
}
Alles anzeigen
public class AlarmReceiver extends WakefulBroadcastReceiver {
public static final String ACTION_ALARM_RECEIVER = "ACTION_ALARM_RECEIVER";
public AlarmReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// Start the service, keeping the device awake while the service is
// launching. This is the Intent to deliver to the service.
Intent service = new Intent(context, AlarmService.class);
startWakefulService(context, service);
}
}
Alles anzeigen
public class AlarmService extends IntentService {
public AlarmService() {
super("AlarmService");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(800);
AlarmReceiver.completeWakefulIntent(intent);
}
}
Alles anzeigen