Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird?

bruce85

Bekanntes Mitglied
Hallo,
ich habe folgendes Problem,
wenn sich die Displaysperre am Handy aktiviert, dann gehen alle Daten verloren, z.B. einen Download, der gerade läuft u.s.w.

In der onDraw Methode wird auch immer wieder erneut public Panel(Context context) aufgerufen, wenn die Displaysperre aktiviert wurde und ich es wieder deaktiviere.

z.B. wird in der Methode public Panel(Context context) einen DialogBox geöffnet, beende ich diesen Dialog und aktiviere mal die Displaysperre und deaktiviere es wieder, dann öffnet sich der DialogBox wieder erneut.

Kann man das Problem irgendwie lösen?

Ich bedanke mich schonmal im Voraus.

MfG
 

bruce85

Bekanntes Mitglied
Weiss denn niemand ne lösung?

Ich teste z.B. meine App am Handy, bei onCreate() wird ein ProgressDialog aufgerufen und etwas gedownloadet, z.B. Datei 1 von 2 wird heruntergeladen, jetzt aktiviert sich z.B. die Bildschirmsperre, die ich dann natürlich wieder deaktiviere und dann ladet es nicht mehr weiter und stattessen steht dann Datei 1 von 0 wird heruntergeladen und der ProgressBar ist eingefrohren.

Oder wenn z.B. eine Datei gedownloadet wurde und der Progressdialog sich dann wieder schließt und ich dann mal die Bildschirmsperre aktiviere und wieder deaktiviere, ist der ProgressDialog wieder geöffnet, was nicht sein darf.

Ich weiss echt nicht, wie ich das Problem beheben kann, in google finde ich auch nix zu diesem Thema.

Ich wäre euch sehr dankbar, wenn mir da jemand Weiterhelfen könnte.

MfG
 

bruce85

Bekanntes Mitglied
Danke Dir.

Kann man das nicht irgendwie verhindern das es erneut geladen wird?
Da ich ein ProgressDialog bei onCreate() erstelle und es sonst immer wieder erneut erstellt wird und das alte überschreibt und dann geht garnix mehr mit dem downloaden, also der Download fortschritt wird dann nicht mehr im ProgressDialog dargestellt.

MfG
 
Zuletzt bearbeitet:

Stroker89

Bekanntes Mitglied
onCreate wird nur aufgerufen, wenn deine App Destroyed wurde...

siehe dazu auch den Android Lifecycle:

c0043363_49336ea62d4c6.jpg


Falls du verhindern möchtest dass deine Daten verloren gehen falls der GC entscheidet deine App zu löschen kannst du es hiermit versuchen (Post von einem stackoverflow Benutzer):
Code:
@Override
public void onSaveInstanceState(Bundle outState){
    iGameContent.saveGame(outState);
}

Save all your needed data into outState, and in the onCreate method, check if its a new instance or saved instance, like this:

Code:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game);

    if (savedInstanceState!=null){
        iGameContent.loadGame(savedInstanceState);
    }else{
        // Normal initialization
    }
}
An example of the save/load to a Bundle is the following:

Code:
public void loadGame(Bundle aBundle){
    iBadsHit = aBundle.getInt("iBadsHits",0);
}

public void saveGame(Bundle aBundle){
aBundle.putInt("iBadsHit", iBadsHit);
}
 
Zuletzt bearbeitet:

bruce85

Bekanntes Mitglied
Vielen Dank.

Irgendwie klappt das nicht so ganz, ich hab mal zum test versucht den AsynkTask bei onDestroy zu beenden:
Java:
@Override
public void onDestroy(){
   super.onDestroy();
   if( aTask != null){
       if(aTask.getStatus().equals( AsyncTask.Status.RUNNING)){
           aTask.cancel(true);
       }
   }
}
private void startDownload() {
    aTask = (DownloadFileAsync) new DownloadFileAsync().execute();
}

irgendwie hat es kene wirkung.
Woran könnte das liegen?

MfG
 

bruce85

Bekanntes Mitglied
Nein, das ist so:
Ich lade über ein ProgressDialog einige dateien herunter und wenn ich mal die Bildschirmsperre aktiviert hatte und wieder deaktiviere, dann ladet es trotztdem im hintergrund weiter aber der ProgressDialog zeigt es dann nicht mehr richtig an, es ist sozusagen stehen geblieben im ProgressDialog.
Der Fortschritt geht nicht mehr weiter, aber es ladet trotzdem im hintergrund weiter runter.

Java:
@Override
    public void onDestroy(){
       super.onDestroy();
       mProgressDialog.setView(null);
       if( aTask != null){
           if(aTask.getStatus().equals( AsyncTask.Status.RUNNING)){
               aTask.cancel(true);
           }
       }
    }
    
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
		case DIALOG_DOWNLOAD_PROGRESS:
			mProgressDialog = new ProgressDialog(NippelActivity.this);
			mProgressDialog.setMessage("Datei (1/"+downloadAnz+") wird heruntergeladen...");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgressDialog.setCancelable(false);
			mProgressDialog.show();
			return mProgressDialog;
		default:
			return null;
        }
    }
    
    private void startDownload() {
        aTask = (DownloadFileAsync) new DownloadFileAsync().execute();
    }

    class DownloadFileAsync extends AsyncTask<String, String, String> {
    	private Exception exception;
    	@Override
    	protected void onPreExecute() {
    		super.onPreExecute();
    		showDialog(DIALOG_DOWNLOAD_PROGRESS);
    	}

    	@Override
    	protected String doInBackground(String... aurl) {
    		int count;

    		try {
    			for (int i=0; i<videoAnz; i++) {
            		if (videos[i].download == 1) {
            			try {
	            			downloadNr = downloadNr + 1;
			    			URL url = new URL("http://meineseite.de/test/"+videos[i].dUrl);
			    			URLConnection conexion = url.openConnection();
			    			conexion.connect();
			
			    			int lenghtOfFile = conexion.getContentLength();
			    			Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
			
			    			InputStream input = new BufferedInputStream(url.openStream());
			    			OutputStream output = new FileOutputStream("/sdcard/"+videos[i].dOrt);
			
			    			byte data[] = new byte[1024];
			
			    			long total = 0;
			
			    			while ((count = input.read(data)) != -1) {
			    				total += count;
			    				publishProgress(""+(int)((total*100)/lenghtOfFile));
			    				output.write(data, 0, count);
			    			}
	            			videos[i].download = 0;
			    			//postInvalidate();
			    			output.flush();
			    			output.close();
			    			input.close();
            			} catch (Exception e) {
            	            this.exception = e;
            	            return null;
            	        }
            		}
    			}
    		} catch (Exception e) {}
    			return null;

    	}
    	protected void onProgressUpdate(String... progress) {
    		 Log.d("ANDRO_ASYNC",progress[0]);
    		 mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    		 mProgressDialog.setMessage("Datei ("+downloadNr+"/"+downloadAnz+") wird heruntergeladen...");
    	}

    	@Override
    	protected void onPostExecute(String unused) {
    		dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    	}
    }

und in der Methode onCreate starte ich den Task über ein AlertDialog:
Java:
startDownload();

Wie könnte man das ganze einfach wieder löschen, wenn die Bildschirmsperre mal aktiviert wurde?

Vielen Dank schonmal.

MfG
 

Stroker89

Bekanntes Mitglied
Hmm ich würde den Download an deiner Stelle auch über einen LocalService und dort den Download über einen Thread oder AsyncTask machen und bei Fortschritt den Broadcast zu der Activity schicken.

Mache gerade etwas ähnliches.
Wenn du den AsyncTask benutzt im Service, ist die Kommunikation ein bisschen leichter, da du direkt von dort aus den Broadcast schicken kannst. Wenn du einen eigenen Thread nehmen möchtest, müsstest du noch die passenden MessageHandler implementieren.
Letzteren Fall benutze ich gerade.

Gruß
 
Zuletzt bearbeitet:

bruce85

Bekanntes Mitglied
Vielen Dank.

Leider bin ich noch nicht so fit bei der Programmierung von Java-Android und weiss nicht, wie ich das machen könnte.

Gibt es Vielleicht gute Tutorials, indem das beschrieben ist?

MfG
 

Stroker89

Bekanntes Mitglied
Das ist gar nicht kompliziert sondern ein super Beispiel :)

Ein Service ist verhält sich ähnlich wie eine Activity, nur ohne UI.

Kommuniziert wird über einen Broadcast. Die sendende Seite schickt einen Broadcast und die empfangende Seite hat einen BroadcastReceiver mit der die Daten empfangen werden können.
Lies dich doch mal ein bisschen in Services ein :)
Sobald du es einmal begriffen hast ist es gar nicht mehr schwer :)

Gruß
 

bruce85

Bekanntes Mitglied
Danke Dir.
Ich habe aber gelesen, dass das ab Android 3.? funktioniert und möchte es auch ab 2.1 verwenden.
Naja ich werd mich damit mal auseinandersetzen und vielen Dank.

MfG
 

bruce85

Bekanntes Mitglied
Naja ich hab so langsam die Lust verloren, schon den ganzen tag sitze ich an einem Problem und es will einfach nicht funktionieren.

Das dumme daran ist, wenn die downloads fertig sind, wird ja wie gewohnt der ProgressDialog beendet, das klappt auch, nur wenn mal die Bildschirmsperre aktiviert wurde und wieder deaktiviert, dann ist der ProgressDialog wieder geöffnet und ich muss die App wieder neu starten.
Ich finde es eifach Du** wieso onCreate wieder erneut aufgerufen wird, anstatt das es einfach ganz normal weiter geht.

Naja, ich denke ich werd das dann wohl aufgeben, hat ja keinen Sinn irgendwie meine ganze Zeit nur für ein kleines Problem zu investieren.

Trotzdem vielen Dank.

MfG
 

bruce85

Bekanntes Mitglied
Habe ich, ich hab die Seite etwas studiert und es jetzt in meiner App eingebaut, klappt alles fehlerfrei, nur downloadet er nichts, es scheint so als würde der Service überhaupt nicht starten.

Hier mal der Code wie ich den Service starte:
Java:
Bundle extras = new Bundle();
Groundy.execute(TestActivity.this, DownloadResolver.class, new DownloadReceiver(), extras);

mProgressDialog = new ProgressDialog(TestActivity.this);
mProgressDialog.setMessage("Video ("+downloadNr+"/"+downloadAnz+") wird heruntergeladen...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();

und hier sollte die Datei heruntergeladen werden:
Java:
public class DownloadService extends IntentService {
    public static final int UPDATE_PROGRESS = 8344;
    public DownloadService() {
        super("DownloadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
    	System.out.println("Test");
        ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
        try {
        	for (int i=0; i<TestActivity.videoAnz; i++) {
        		if (TestActivity.videos[i].download == 1) {
        			TestActivity.downloadNr = TestActivity.downloadNr + 1;
		            URL url = new URL("http://testseite.de/data/"+TestActivity.videos[i].dUrl);
		            URLConnection connection = url.openConnection();
		            connection.connect();
		            // this will be useful so that you can show a typical 0-100% progress bar
		            int fileLength = connection.getContentLength();
		
		            // download the file
		            InputStream input = new BufferedInputStream(url.openStream());
		            OutputStream output = new FileOutputStream("/sdcard/"+TestActivity.videos[i].dOrt);
		
		            byte data[] = new byte[1024];
		            long total = 0;
		            int count;
		            while ((count = input.read(data)) != -1) {
		                total += count;
		                // publishing the progress....
		                Bundle resultData = new Bundle();
		                resultData.putInt("progress" ,(int) (total * 100 / fileLength));
		                receiver.send(UPDATE_PROGRESS, resultData);
		                output.write(data, 0, count);
		            }
		            TestActivity.videos[i].download = 0;
		            output.flush();
		            output.close();
		            input.close();
        		}
        	}
        } catch (IOException e) {
            e.printStackTrace();
        }

        Bundle resultData = new Bundle();
        resultData.putInt("progress" ,100);
        receiver.send(UPDATE_PROGRESS, resultData);
    }
}

Der ProgressBar bleibt unverändert und der Download wird auch nicht ausgeführt.
Ich hab zum test versucht etwas in die Console auszugeben, ob überhaupt der Teil ausgeführt wird, leider kein ergebnis.

Die folgende rechte habe ich gesetzt:
[XML]<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application.......................................
<service android:name=".DownloadService"/>
<service android:name="com.codeslap.groundy.GroundyService"/>[/XML]

Woran könnte das Problem liegen?

Edit: Bei DownloadResolver meldet er eine URL Exception:
Java:
package com.codeslap.groundy;

import java.io.File;
import java.io.IOException;

public class DownloadResolver extends CallResolver {

    public static final String PARAM_URL = "com.groundy.sample.param.url";

    @Override
    protected void updateData() {
        try {
            File dest = new File(getContext().getFilesDir(), "downloaded_file.ext");
            String url = getParameters().getString(PARAM_URL);
            GroundyUtils.downloadFile(getContext(), url, dest, GroundyUtils.fromResolver(this));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void prepareResult() {
        setResultCode(Groundy.STATUS_FINISHED);
    }
}

2 Sachen sind mir jetzt noch unklar:
Java:
PARAM_URL und downloaded_file.ext
Welche Url sollte ich angeben und was hat die Variable dest aufsich?

MfG
 
Zuletzt bearbeitet:

bruce85

Bekanntes Mitglied
Danke Dir.

Ich habe mein Beitrag oben editiert und erhalte jetzt eine URL Exception, das diese URL nicht gefunden werden kann.

Ich habe die Groundy library heruntergeladen und hier ist die execute vorhanden:
Java:
package com.codeslap.groundy;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.ResultReceiver;

public class Groundy {
    public static final String KEY_PARAMETERS = "com.codeslap.groundy.key.paramaters";
    public static final String KEY_RESULT = "com.codeslap.groundy.key.result";
    public static final String KEY_ERROR = "com.codeslap.groundy.key.error";
    public static final String KEY_RECEIVER = "com.codeslap.groundy.key.receiver";
    public static final String KEY_PROGRESS = "com.codeslap.groundy.key.progress";

    public static final int STATUS_FINISHED = 200;
    public static final int STATUS_ERROR = 232;
    public static final int STATUS_RUNNING = 224;
    public static final int STATUS_PROGRESS = 225;
    public static final int STATUS_CONNECTIVITY_FAILED = 8433;

    /**
     * Queue a call resolver to be executed
     *
     * @param context  needed to start the service
     * @param resolver call resolver implementation
     * @param receiver result receiver to report results back
     * @param extras   the application code
     */
    public static void queue(Context context, Class<? extends CallResolver> resolver, ResultReceiver receiver,
                             Bundle extras) {
        startApiService(context, receiver, resolver, extras, false);
    }

    /**
     * Execute this call resolver asynchronously
     *
     * @param context  needed to start the service
     * @param resolver call resolver implementation
     * @param receiver result receiver to report results back
     * @param extras   the application code
     */
    public static void execute(Context context, Class<? extends CallResolver> resolver, ResultReceiver receiver,
                               Bundle extras) {
        startApiService(context, receiver, resolver, extras, true);
    }

    private static void startApiService(Context context, ResultReceiver receiver,
                                        Class<? extends CallResolver> resolver, Bundle params, boolean async) {
        Intent intent = new Intent(context, GroundyService.class);
        if (async) {
            intent.putExtra(GroundyIntentService.EXTRA_ASYNC, async);
        }
        intent.setAction(resolver.getName());
        if (params != null) {
            intent.putExtra(KEY_PARAMETERS, params);
        }
        intent.putExtra(KEY_RECEIVER, receiver);
        context.startService(intent);
    }
}

Edit: Hier die fehlermeldung, die ich bekomme:
Java:
11-18 13:10:07.237: W/System.err(636): java.lang.RuntimeException: java.net.MalformedURLException: Protocol not found: URL
MfG
 
Zuletzt bearbeitet:

bruce85

Bekanntes Mitglied
Das funktioniert ja jetzt, nur bekomme ich eine URL Exception beim starten des Service.
Bei DownloadResolver meldet er eine URL Exception:
Java:
package com.codeslap.groundy;

import java.io.File;
import java.io.IOException;

public class DownloadResolver extends CallResolver {

    public static final String PARAM_URL = "com.groundy.sample.param.url";

    @Override
    protected void updateData() {
        try {
            File dest = new File(getContext().getFilesDir(), "downloaded_file.ext");
            String url = getParameters().getString(PARAM_URL);
            GroundyUtils.downloadFile(getContext(), url, dest, GroundyUtils.fromResolver(this));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void prepareResult() {
        setResultCode(Groundy.STATUS_FINISHED);
    }
}

2 Sachen sind mir jetzt noch unklar:
Java:
PARAM_URL und downloaded_file.ext
Welche Url sollte ich angeben und was hat die Variable dest aufsich?

MfG

Die 2 Dinge sind mir jetzt noch unklar:
Java:
public static final String PARAM_URL = "com.groundy.sample.param.url";
File dest = new File(getContext().getFilesDir(), "downloaded_file.ext");

Was muss ich dort genau angeben?
Weil die Download Url von den dateien, die ich downloaden möchte, habe ich ja im DownloadService.java drin und ich weiss nicht, was das hier aufsich hat.

Danke schonmal.

MfG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Android alle erstellten Felder werden übereinander nur in der ersten Zeile in der Emulation dargestellt Android & Cross-Platform Mobile Apps 6
D Android Layout für alle Geräte Android & Cross-Platform Mobile Apps 4
E Android Zeichenview alle 3 Sekunden aktualisieren Android & Cross-Platform Mobile Apps 5
S Android Alle bestehenden Activties bekommen Android & Cross-Platform Mobile Apps 4
M Firebase RealtimeDatabase - Daten aus Queries in CSV File speichern Android & Cross-Platform Mobile Apps 1
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
N XY-Plot plottet keine Daten Android & Cross-Platform Mobile Apps 0
W Background Service Daten verarbeiten/Schleife ect. Android & Cross-Platform Mobile Apps 1
R Android Daten speichern und anzeigen Android & Cross-Platform Mobile Apps 7
MiMa Daten vom Brustgurt bekommen? Android & Cross-Platform Mobile Apps 3
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
W Android Browser startet immer, bevor die Daten dafür geholt wurden Android & Cross-Platform Mobile Apps 15
J Android Server-Login Daten in der App sicherer hinterlegen? Android & Cross-Platform Mobile Apps 7
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
L Android Daten von Webseite runterladen, die mit HTTP-Authentifizierung gesichert ist Android & Cross-Platform Mobile Apps 5
B Accelerometer daten umwandeln Android & Cross-Platform Mobile Apps 41
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
A Android Daten in der Cloud speichern (Google) Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
M Anzeigen der Daten dauert zu lange - Progressdialog? Android & Cross-Platform Mobile Apps 5
K Android DialogFragment mit SimpleCursorAdapter: Auf Daten zugreifen? Android & Cross-Platform Mobile Apps 4
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G Wie gebe ich dem DrawView die Daten mit? Android & Cross-Platform Mobile Apps 2
V App Daten in Java Applikation Android & Cross-Platform Mobile Apps 3
D Android Daten verwalten Android & Cross-Platform Mobile Apps 2
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
M Android Von Smartphone auf Daten von Server zugreifen Android & Cross-Platform Mobile Apps 2
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
L Android Einlesen und rausschreiben von Daten auf SD Android & Cross-Platform Mobile Apps 3
U Android Daten dauerhaft speichern? Android & Cross-Platform Mobile Apps 2
P Java ME benutzer daten speichern Android & Cross-Platform Mobile Apps 5
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
X RMS - Will die Daten auf den PC kopieren Android & Cross-Platform Mobile Apps 3
B Daten in *.txt schreiben Android & Cross-Platform Mobile Apps 7
R Lesen und schreiben von Daten. Android & Cross-Platform Mobile Apps 2
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
O eingehende Daten speichern Android & Cross-Platform Mobile Apps 2
W Wieso gehen Log nicht im Service? Android & Cross-Platform Mobile Apps 20

Ähnliche Java Themen

Neue Themen


Oben