AlarmManager funktioniert nicht

  • Antworten:19
  • Bentwortet
Rolf Baumann
  • Forum-Beiträge: 24

16.03.2014, 20:51:15 via Website

Ich versuche schon 2 Tage ohne Erfolg, den AlarmManager in mein Script einzubauen:

Manifest
1...
2</activity>
3 <receiver android:name=".OnAlarmReceive" />
4 </application>


Quellcode Alarm setzen
1int kontrolle=1;//1 min
2alarmset(kontrolle);

Quellcode
1public void alarmset(int kont){
2 Log.d("QIIIX ", "Kontroll: " + kont);
3 Calendar cal = Calendar.getInstance();
4 cal.add(Calendar.SECOND, kont*60);
5 alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
6 Intent intentalarm = new Intent(this, OnAlarmReceive.class);
7 alarmIntent = PendingIntent.getBroadcast(this, 0, intentalarm, PendingIntent.FLAG_CANCEL_CURRENT);
8 alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);
9 if (alarmMgr!= null) {
10 Log.d("QIIIX ", "Alarm set: " + alarmMgr);
11 }
12 }
13 public class OnAlarmReceive extends BroadcastReceiver {
14 @Override
15 public void onReceive(Context context, Intent intent) {
16 Log.d("Kontr QIIIX Alarm", "Alarm ausgelöst");
17 }
18 }

Der Alarm wird gesetzt, wie ich dem Logcat entnehmen kann, jedoch, wird "onReceive" nicht durchgeführt.

Bin dankbar für jeden Hinweis.

Antworten
Michele
  • Forum-Beiträge: 1.525

16.03.2014, 20:57:46 via Website

Hallo Rolf.

Ich kann auch nichts im onReceive() bei dir sehen, außer eine Log.d.
Was soll da auch dann passieren?:D


LG

— geändert am 16.03.2014, 20:58:12

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

16.03.2014, 21:18:17 via Website

Hallo Michele

Im würde erwarten, dass im Logcat die Meldung "Alarm ausgelöst" kommt.

Gruss
Rolf

Antworten
Michele
  • Forum-Beiträge: 1.525

16.03.2014, 21:36:45 via Website

Achso.

Ich dachte du meintest, das eine Methode dann aufgerufen werden sollte.

Die Log.d wird aber trotzdem nur aufgerufen, wenn du natürlich dein BroadcastReceiver Startest.
Und anscheinend wird er das wohl nicht. :D


LG

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

16.03.2014, 22:03:31 via Website

OnAlarmReceive ist im gleichen Quellcode (und im gleichen Package) wie alles andere. Ich erhalte keine Fehlermeldungen. Im Logcat erscheint zur richtigen Zeit eine Meldung "AlarmManager wait for Alarm result:0; AlarmManager Trigger ....." doch das ist schon alles.
Gruss
Rolf

Antworten
impjor
  • Forum-Beiträge: 1.793

16.03.2014, 22:07:19 via App

Ersetze mal .OnAlarmReceive durch den vollständigen Packagename: com.example.OnAlarmReceive z.B. Kommt denn die Log-Meldung "Alarm set" im LogCat an? Bleibt deine App die Zeit im Vordergrund bis der Alarm kommen sollte?

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

16.03.2014, 22:25:39 via Website

Ich habe im Manifest den vollständigen Package-name eingesetzt, ohne Erfolg

Im Logcat erhalte ich eine Error-Meldung:
03-16 22:19:42.791: E/Watchdog(2025): !@Sync 6080

Dann die Meldung:
03-16 22:19:43.301: V/AlarmManager(2025): waitForAlarm result :1
03-16 22:19:43.301: V/AlarmManager(2025): trigger ELAPSED_REALTIME_WAKEUP or RTC_WAKEUP

Liebe Grüsse
Rolf

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

16.03.2014, 22:37:55 via Website

Ich vermute, die Error-Meldung Watchdog
03-16 22:20:42.791: E/Watchdog(2025): !@Sync 6082

hat mit dem Problem nichts zu tun, da ich diese unabhängig vom App alle 30 Sekunden erhalte.

Antworten
Michele
  • Forum-Beiträge: 1.525

16.03.2014, 23:12:05 via Website

Hallo.

Steige da gerade nicht mehr durch.:D
Zeige doch bitte mehr von deinem Code.


LG

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

16.03.2014, 23:59:58 via Website

Receiver im Manifest eingetragen ? Schreibe mal den kompletten Namen ins Manifest

— geändert am 17.03.2014, 00:00:44

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Michele
  • Forum-Beiträge: 1.525

17.03.2014, 00:01:40 via Website

Ach jetzt hab ich es erst verstanden und voll übersehen das deine Methode "alarmset()"
deinen BroadcastReceiver Starten soll.:*)

Schreibe bitte in deinem "alarmset()" mal einiges um.
1alarmIntent = PendingIntent.getBroadcast(this, 0, intentalarm, 0);
2alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),0, alarmIntent);

Teste es nun nochmal.

LG

— geändert am 17.03.2014, 03:46:31

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

17.03.2014, 08:00:30 via Website

Ich habe den Code geändert und getestet, leider immer noch ohne Erfolg. Ich erhalte im Logcat folgende Warnungen
03-17 07:46:41.940: W/IInputConnectionWrapper(939): getSelectedText on inactive InputConnection
03-17 07:46:41.940: W/IInputConnectionWrapper(939): setComposingText on inactive InputConnection
03-17 07:46:41.940: W/IInputConnectionWrapper(939): getExtractedText on inactive InputConnection

Ich kann diese Warnungen nicht interpretieren und weiss nicht, ob dies in Zusammenhang mit dem Problem steht.
LG

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

17.03.2014, 08:49:37 via Website

Ich habe das Ganze neu in einem Testprojekt erstellt, um den ganzen Code zeigen zu können (funktioniert immer noch nicht):

Quellcode:
1package ch.info.alarmtest;
2
3import java.util.Calendar;
4import android.media.Ringtone;
5import android.media.RingtoneManager;
6import android.net.Uri;
7import android.os.Bundle;
8import android.app.Activity;
9import android.app.AlarmManager;
10import android.app.PendingIntent;
11import android.content.BroadcastReceiver;
12import android.content.Context;
13import android.content.Intent;
14import android.util.Log;
15import android.view.View;
16
17public class MainActivity extends Activity {
18 @Override
19 protected void onCreate(Bundle savedInstanceState) {
20 super.onCreate(savedInstanceState);
21 setContentView(R.layout.activity_main);
22 }
23 public void button1(View view){
24 alarmset();
25 }
26 public void alarmset(){
27 Calendar cal = Calendar.getInstance();
28 cal.add(Calendar.SECOND, 60);
29 AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
30 Intent intentalarm = new Intent(this, OnAlarmReceive.class);
31 PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentalarm, 0);
32 alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);
33 if (alarmMgr!= null) {
34 Log.d("TEST ", "Alarm set: " + alarmMgr);
35 }
36 }
37 public class OnAlarmReceive extends BroadcastReceiver {
38 @Override
39 public void onReceive(Context context, Intent intent) {
40 Log.d("TEST", "Alarm ausgelöst");
41 Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
42 Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
43 r.play();
44 }
45 }
46}


Manifest
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="ch.info.alarmtest"
4 android:versionCode="1"
5 android:versionName="1.0" >
6 <uses-sdk
7 android:minSdkVersion="8"
8 android:targetSdkVersion="16" />
9 <application
10 android:allowBackup="true"
11 android:icon="@drawable/ic_launcher"
12 android:label="@string/app_name"
13 android:theme="@style/AppTheme" >
14 <activity
15 android:name="ch.info.alarmtest.MainActivity"
16 android:label="@string/app_name" >
17 <intent-filter>
18 <action android:name="android.intent.action.MAIN" />
19 <category android:name="android.intent.category.LAUNCHER" />
20 </intent-filter>
21 </activity>
22 <receiver android:name=".OnAlarmReceive" />
23 </application>
24</manifest>

Ich erhalte die Logcat-Meldung "Alarm set", jedoch nicht "Alarm ausgelöst". Fehlermeldungen erhalte ich keine im Logcat.

Ich danke Euch noch einmal für Eure Hilfe!
LG

Antworten
Michele
  • Forum-Beiträge: 1.525

17.03.2014, 09:22:37 via Website

Hallo und danke für den ganzen Code.

1. Bitte mach lieber in einer neuen Extra .class einen BroadcastReceiver.
Nicht in der Activity.
Übersichtlicher sowas.

2. Wozu überhaupt sowas in einem BroadcastReceiver?
Ein Service würde auch gehen. Oder in der Activity mit einem Timer und TimerTask z.B oder einem Handler.


LG

— geändert am 17.03.2014, 09:39:22

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.03.2014, 10:03:21 via Website

Ohne den Code zu sehen, wenn Ich lese das der Receiver dann so im Manifest steht kann das nicht gehen.
Wie unter Java allgemein bekannt müssen innere Klassen mit $ angebenen werden, also:

com.bla.bla.product.Hauptklasse$InnereKlasse

Sowas sollte Lint ansich finden

Aber sonst stimme Ich Michele nur zu, es ist schlechtes Design alles in eine Activity zu schieben, führt zu Fehlern und man erkennt sowas meist erst zur laufzeit. Ein BroadcastReceiver ist eine Klasse mit einer bestimmten Aufgabe, die darf ruhig ihre eigene Datei bekommen.

— geändert am 17.03.2014, 10:06:04

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

17.03.2014, 10:33:44 via Website

Vielen Dank für die Unterstützung. Da ich noch Anfänger bin weiss ich nicht sicher, ob ich den Hinweis richtig interpretiere.

Ich habe das Manifest abgeändert in
<receiver android:name="ch.info.alarmtest.MainActivity$OnAlarmReceive" />

und erhalte nun die Fehlermeldung:
03-17 10:17:23.972: E/AndroidRuntime(14502): FATAL EXCEPTION: main
03-17 10:17:23.972: E/AndroidRuntime(14502): java.lang.RuntimeException: Unable to instantiate receiver ch.info.alarmtest.MainActivity$OnAlarmReceive: java.lang.InstantiationException: can't instantiate class ch.info.alarmtest.MainActivity$OnAlarmReceive; no empty constructor
03-17 10:17:23.972: E/AndroidRuntime(14502): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2243)
..
LG

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.03.2014, 10:46:34 via Website

Das Framework kann den Receiver nicht erstellen da dein Konstruktor parameter benötigt.

Da deine klasse eine innere ist muss das Framework (wenn es den ging zuerst die Activity erzeugen um dann den Reveiver erzeigen zu können.
Mein Tip ist den Reveiver in eine extra Klasse zu schieben, raus aus der Activity.

Wieso das Framework die Klasse nicht erzeugen kann ist in dem Fall das sie keine "statische" klasse ist. Das sind Grundlagen die man
beherrschen sollte. Hier mal ein paar Infos dazu: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


1public static class OnAlarmReceive extends BroadcastReceiver {
238 @Override
339 public void onReceive(Context context, Intent intent) {
440 Log.d("TEST", "Alarm ausgelöst");
541 Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
642 Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
743 r.play();
844 }
45 }
46}

PS: Diese Code Formatierung hier im Forum ist weiterhin unterirdisch, setzen 6!

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rolf Baumann
  • Forum-Beiträge: 24

17.03.2014, 11:12:22 via Website

Jetzt funktioniert das Ganze! Toll!!!

Die Lösung war wirklich das Manifest
<receiver android:name="ch.info.alarmtest.MainActivity$OnAlarmReceive" />

und die Ergänzung von static in
public static class OnAlarmReceive extends BroadcastReceiver {

Ich danke Euch ganz herzlich für die hilfreiche Unterstützung!!!

Liebe Grüsse
Rolf

Antworten
Michele
  • Forum-Beiträge: 1.525

17.03.2014, 11:14:19 via Website

Na das doch super.

Dann noch bitte das Thread auf "Beantwortet" setzen.:D


LG

Antworten