BroadcastReceiver erhält den Alarm vom AlarmManager nicht

  • 6 Antworten
  • Letztes Antwortdatum
M

mpmxxd

Neues Mitglied
0
Hallo liebe Mitglieder,

ich bin neu hier, und habe mich ehrlich gesagt bis jetzt nur durch Webtutorials meines Wissens bemächtigt und Foren vermieden. Nun aber habe ich mich zuerst für diese Website entschieden - und bedanke mich im Voraus für eure Antworten :smile: :

Ich habe folgenden Code auf meinem Motorola mit Android 4.1 compiliert und ausgeführt. Den ersten Toast-Text gibt er noch aus, aber es scheint als würde der Alarm nicht beim BroadcastReceiver ankommen - der zweite Toast erscheint nicht. Kein Fehler laut Eclipse im Code - auch keine Warnung:

Das ist die MainActivity.java:

Code:
package de.mp.locapp;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity
{

	double longitude;
	double latitude;
	final static private long ONE_SECOND = 1000;
    //final static private long ONE_HOUR = ONE_SECOND * 3600;
    PendingIntent pi;
    BroadcastReceiver br;
    AlarmManager am;
    
    
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView tv = (TextView) findViewById(R.id.textView1);
        tv.setText("Syncronizing Location..");
        
        pi = PendingIntent.getService(this, 0, new Intent("de.mp.locapp"),PendingIntent.FLAG_UPDATE_CURRENT);
        am = (AlarmManager) (getSystemService(Context.ALARM_SERVICE));
        
        Toast.makeText(MainActivity.this, "Location updating", Toast.LENGTH_SHORT).show();
        
        am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 20*ONE_SECOND, pi);
           
		final LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
	    
	    final LocationListener locListener = new LocationListener() {
	    
	      	
	    	@Override
				public void onLocationChanged(Location arg0)
				{	
					Location lastLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
					latitude = lastLocation.getLatitude();
					longitude = lastLocation.getLongitude();
					   		
				}

				@Override
				public void onProviderDisabled(String arg0) {
					// TODO Auto-generated method stub
					
				}

				@Override
				public void onProviderEnabled(String arg0) 
				{
					// TODO Auto-generated method stub
					
				}

				@Override
				public void onStatusChanged(String arg0, int arg1, Bundle arg2) 
				{
					// TODO Auto-generated method stub
				}
					
			};
		
		locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,15,20,locListener);
		
		registerReceiver(br, new IntentFilter("de.mp.locapp"));
        br = new BroadcastReceiver() {

			@Override
			public void onReceive(Context context, Intent intent) {
							
				locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
	
				Toast.makeText(MainActivity.this, "Location updated", Toast.LENGTH_LONG).show();
				
				String sLongLat = Double.valueOf(longitude).toString()+", "+Double.valueOf(latitude).toString();

				FileOutputStream fos = null;
	             
	             try {
					fos = new FileOutputStream(new File("/storage/sdcard0/","longlatGPS.txt"));
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	           

	             try {
					fos.write(sLongLat.getBytes());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	            
	             try {
					fos.close();
				} catch (IOException e) {
				
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	            		 
			}
		
        };
        
            
     
    }
    
 }




und das ist die Manifest:

Code:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



Vielen Dank im Voraus
mpmxxd
 
Deine Code sieht etwas durcheinander aus....kein schöner Stil. Dein Receiver sollte übrigens eine eigenständige Klasse sein und kein Bestandteil der Activity.

Was hast du denn überhaupt vor? So wie es aussieht möchtest du zu bestimmten Zeitpunkten deine GPS Position in eine Datei schreiben. Warum nimmst du dafür nicht einen Service? Ein BroadcastReceiver ist meiner Meinung nach überflüssig.
 
Hallo ApeDick,vielen Dank erstmal für deine Antwort! Mein Code ist wirklich alles andere als schön - ist mir regelrecht peinlich - aber ich habe mich noch nicht getraut, die ganzen Funktionen auszulagern oder eigenständige Klassen oder Funktionen zu schaffen.Rein von der Logik her müsste es also so heißen, oder?:

Code:
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);// Start every 30 seconds
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

Ja, ich möchte erstmal eine App kreieren, die jeden Tag um eine bestimmte Uhrzeit mehrmals (bzw. in bestimmten Zeitintervallen) die GPS-Location in eine Datei speichert (später soll das Prinzip noch ausgebaut werden, aber erst wenn es so klappt).


Vielen Dank für die Hilfe und freundliche Grüße

mpmxxd
 
Zuletzt bearbeitet:
Für jemanden der gerade erst neu in die Android Entwicklung einsteigt, hast du dir aber direkt ein "komplexes" Thema ausgesucht.
Ich werde dir hier sicher keinen fertigen Code liefern, weil der bringt dir nicht viel.
Wichtig ist auf jeden Fall, dass du einen Service schreibst, welcher zu bestimmten Zeiten ausgeführt wird. Ungefähr so, wie du das in deinem letzten Codebeispiel gemacht hast. In deinem Service erzeugst du dann den Locationmanager und registrierst dich mit einem Listener. Wenn dann deine Methode on LocationChanged() aufgerufen wird, und die aktuelle Location übergeben wird , kannst du dann dort die Infos in deine Datei schreiben.
Um Akku zu sparen, solltest du dich dann am LocationManager "abmelden" und deinen Service beenden.

Soweit verständlich? Falls nicht, schreib mir einfach mal eine PN.
 
Hallo ApeDick,

vielen Dank schon einmal für deine Antwort! Ich bin gerade dabei es genau so aufzubauen - ich melde mich die nächsten Tage zurück und Berichte gerne.


freundliche Grüße

mpmxxd
 
Hallo ApeDick,

ich habe jetzt versucht, mein Programm so aufzubauen, wie ich es verstanden habe. Es hat gestern auch geklappt, aber nach stundenlanger Suche nach dem (bei Problems nicht aufgeführten) Fehler gibt mein Handy/Emulator keine Nachricht aus. Irgendwie startet der Alarm den Service nicht und auf meinem Handy/Emulator erscheint keine Toast-Nachricht (die eigentlich von der MyAlarmService-Klasse aufgerufen werden sollte).

Das ist mein Code:


Die AndroidAlarmService.java (Main-Activity):
Code:
public class AndroidAlarmService extends Activity {

	private PendingIntent pendingIntent;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_alarm_service);
        
        Intent myIntent = new Intent(this,MyAlarmService.class);
        pendingIntent = PendingIntent.getService(this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        
        /*Calendar calendar = Calendar.getInstance();
        
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 10); */
        
        am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+10000, AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);
        Toast.makeText(this, "Welcome! Please wait while location is getting determined.", Toast.LENGTH_SHORT).show();
    
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.android_alarm, menu);
        return true;
    }
    
}


Und das ist meine MyAlarmService.java:
Code:
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyAlarmService extends Service {

	final String _logTag = "Monitor Location";
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		Toast.makeText(this, "Location updating", Toast.LENGTH_LONG).show();
		Log.d(_logTag,"Monitor Service - Location service started");
		}


	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		return super.onUnbind(intent);
	
	}

	
}



hier noch die Manifest.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smartpositioningsystemapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="3"
        android:targetSdkVersion="18" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.smartpositioningsystemapp.AndroidAlarmService"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Vielen Dank im voraus und verzweifelte, freundliche Grüße
mpmxxd
 
Zuletzt bearbeitet:
Bitte beachte den Lifecycle eines Service! So wie du deinen Service gestartet hast, wird die onCreate Methode nur einmal durchlaufen. Ich hatte oben geschrieben, du sollst den Service beenden, wenn du ihn nicht mehr brauchst.

Services | Android Developers

Bei jedem weiteren Aufruf per AlarmManager wird onStartCommand () deines Service aufgerufen. Also Entweder lagerst du deinen Code entsprechend aus, oder du beendest den Service mit stopSelf(). Dann würde der Alarmmanager beim nächsten auslösen auch wieder onCreate deines Service ausführen.
 
Zuletzt bearbeitet:
Zurück
Oben Unten