APP an bestimmten Wochentagen automatisch starten

  • Antworten:23
Eve W.
  • Forum-Beiträge: 23

26.09.2016, 17:53:30 via Website

Hallo,

Hilfe, ich bin total überfordert. Dank meines Buches ("Android Entwicklung für Dummies") habe ich jetzt eine APP, ein Widget, und eine Klasse AppWidgetService. Aber es klappt leider nicht so wie ich mir das vorstelle...

Also:
Ich habe eine App, die an bestimmten Wochentagen automaitsch gestartet werden soll. Die Wochentage kann der User einstellen. Die App merkt sich das (SharedPreferences), das funktioniert bereits.

So. Aber wie mache ich das jetzt, dass die App auch nur an diesen bestimmen Wochentagen gestartet wird? Brauche ich dafür tatsächlich ein Widget? Oder einen IntentServie?

Im ersten Schritt wollte ich, dass die App dann gestartet wird, wenn man auf das Widget klickt. Aber das klappt leider nicht, mein Widget ruft diesen AppWidgetService auf, aber nicht meine Activity...

Wenn ich google, finde ich schon Code-Snippets, aber die funktionieren alle nicht bei mir...

Mein Plan:
das Widget kuckt: welcher Tag ist heute? Dienstag. Soll ich Dienstag laufen? Ja? Dann starte die MainActivity automatisch.

Mein AppWidgetService kann auch auf die SharedPreferences meiner MainActivity.class zugreifen, das funktioniert also grundsätzlich schon...

Mein Problem: wo soll ich denn überhaupt meine App aufrufen? Im "onHandleIntent" ? Oder im updateUi() ? Brauch ich dazu nochmal einen Intent? Oder einfach mit startActivity(intent); ?
Ich hab schon soviel ausprobiert... nichts hat funktioniert.

Und ich entwickle auf Android 4.2 mit eclipse.

Danke für jeden Tip!
:-)

VG,
Eve

— geändert am 26.09.2016, 18:10:29

Antworten
swa00
  • Forum-Beiträge: 3.704

26.09.2016, 18:35:13 via Website

Hallo Eve,

willkommen im Forum .

Nun , als aller erstes würde ich empfehlen auf Android Studio zu wechseln. Eclipse ist eher veraltet und
wird von uns Entwickler auch nicht mehr verwendet
https://developer.android.com/studio/index.html

Dann kann man nun schlecht was sagen , weil wir den Code von Dir nicht sehen können.

Was Alarme betrifft, so solltest du mal nach dem Alarmmanager schauen
https://developer.android.com/reference/android/app/AlarmManager.html

Und für Deine Grundlagen empfehle ich dir , neben dem Buch diese Beiden Links durchzuarbeiten

http://openbook.rheinwerk-verlag.de/javainsel/
https://developer.android.com/training/basics/firstapp/index.html

Viel Erfolg

lg
Stefan

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

26.09.2016, 18:45:36 via Website

Hallo Stefan,

danke für die Antwort und die Links. Ich werde mal Code posten, wenn ich aufgeräumt hab... hab so viel ausprobiert...

Aber das grundsätzliche Vorgehen mit Widget und so ist wohl ok?

Welcher Code wäre denn hilfreich? Vermutlich der onHandleIntent()?

Ich habe das Android Studio tatsächlich installiert, aber der Grund warum ich nicht damit arbeite, ist, dass mein Laptop wohl zu alt ist. Es dauert geschlagene 10 Minuten bis es startet... das ist mir zu lang...

VG,
Eve

— geändert am 26.09.2016, 18:46:50

Antworten
swa00
  • Forum-Beiträge: 3.704

26.09.2016, 19:02:39 via Website

Hallo Eve,

ehrlich gesagt , ohne Code kann man dieser Stelle natürlich schlecht eine zufriedene Antwort geben.

Klar kann man so etwas mit einem Widget machen, dafür gibt es viele Wege.
Es kommt darauf an , was du dir als Entwickler so vorstellst.

OnHandleIntent() ist ein Override vom IntentService
https://developer.android.com/reference/android/app/IntentService.html

und da man nicht sagen kann , wo , wann und wie du den verwendet hast, kann ich auch hier nichts
Gültiges dazu schreiben .

Schau dir mal Beispiele zum AlarmManager an - damit bist du besser bedient.

P.S Ohne AndroidStudio wird es Tag für Tag für dich schwerer, was gültiges auf die Beine zu stellen .

lg
Stefan

— geändert am 26.09.2016, 19:04:22

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

26.09.2016, 19:09:09 via Website

Hi Stefan,
danke für deine Geduld... :-)

Hier mal der Code-Auszug. Der kommt dran, sobald ich das Widget auf meinen Startbildschirm ziehe.

public class AppWidgetService extends IntentService
{
@Override
protected void onHandleIntent(Intent intent)
{
msgTxt = "onHandleIntent";
Log.i(LOG_TAG,msgTxt);

    // das ist meine Funktion, die die SharedPreferences abfrägt und ermittelt, 
    // ob es der richtige Wochentag ist
    int whattodo = CheckAction();

    msgTxt = "whattodo= "+whattodo;         
    Log.i(LOG_TAG,msgTxt); 

    if(intent != null  && whattodo == 0)
    {
        //hier wollte ich meine MainActivity starten...

        msgTxt = "wir starten die app ganz normal. Aber wie?";          
        Log.i(LOG_TAG,msgTxt);

        Intent intent2 = new Intent(this, MainActivity.class);

        String packname = getPackageName();
        RemoteViews remoteViews = new RemoteViews(packname, R.layout.activity_main);

        PendingIntent pendingIntent2 = PendingIntent.getActivity(this, 0, intent2, Intent.FLAG_ACTIVITY_NEW_TASK);
        remoteViews.setOnClickPendingIntent(R.id.LayoutOmaCare,  pendingIntent2);

        startActivity(intent2);


    }

}

Oje, ich hoffe das ist jetzt schön formatiert...

Ich bekomme die Exception "calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?"

Aber ich hab das Flag doch gesetzt...

?

VG,
Eve

Antworten
swa00
  • Forum-Beiträge: 3.704

26.09.2016, 20:51:13 via Website

Hallo Eve

versuche es einfach mal so

Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName(context, MainActivity.class);
intent.setComponent(cn);
context.startActivity(intent);

lg
Stefan

— geändert am 26.09.2016, 23:21:07

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 07:21:12 via Website

Guten Morgen,

vielen Dank!

Hat leider auch nicht geklappt :-(

Jetzt versuche ich es mal mit diesem AlarmManager.

VG,
Eve

Antworten
swa00
  • Forum-Beiträge: 3.704

27.09.2016, 08:00:18 via Website

Guten Morgen Eve,

a) was hat nicht geklappt ?
b) wie sieht dein Code denn jetzt aus ?
c) läuft deine MainActivity denn überhaupt eigenständig ?
d) was sagt dein Errorlog ?
e) was ist in der Manifest drin ?

Um dir wirklich helfen zu können, benötigen wir von deiner Seite mehr input, denn unsere Kristallkugel
ist nur beschränkt leistungsfähig :-)

Es nutzt nichts uns zu sagen "Das Auto klappert" aber es nicht hinzustellen.

lg
Stefan

— geändert am 27.09.2016, 08:23:52

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 09:52:04 via Website

Hi Stefan,

ja das verstehe ich. Leider habe ich den alten Code schon gelöscht. Aber auch mit AlarmManager klappt's nicht. Oje...

Also, meine APP läuft eigenständig.

Aus meinem Buch habe ich die Klasse ReminderManager abgeschrieben. Mit einer kleinen Änderung: das Buch verwendet .set(), aber ich habe daraus .setRepeating() gemacht.

public class ReminderManager

{
public static void setReminder(Context context, long taskId, String title, Calendar when)
{
// Info: when wird derzeit nicht ausgewertet. Coming soon...

    AlarmManager alarmManager  =  (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, OnAlarmReceiver.class);

    i.putExtra(Intent.EXTRA_TEXT, taskId);
    i.putExtra(Intent.EXTRA_TITLE,  title);

          long now = System.currentTimeMillis();

    // Alle 2 Minuten
       long interval = DateUtils.MINUTE_IN_MILLIS * 2; 

     //Wann soll der Service das erste Mal gestartet werden?    
     long firstStart = now + interval;

    PendingIntent pi = PendingIntent.getBroadcast(context,  0, i, PendingIntent.FLAG_ONE_SHOT);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firstStart, interval,pi);
}

}

Dann weiß ich nicht so recht, wann ich diese Klassen denn aufrufen soll. Derzeit passiert das im onCreate meiner MainActivity:

            long taskId = 789;
    String title = "Titel";

    Date aktDate = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(aktDate);

    Context context = getBaseContext();
    ReminderManager .setReminder(context, taskId, title, c);

Mein Manifest schaut so aus (auszugsweise):

   <receiver
         android:name=".receiver.OnAlarmReceiver"
         android:exported="false"/>

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Und die Klasse OnAlarmReceiver:

public class OnAlarmReceiver extends BroadcastReceiver
{
public String msgTxt;
String LOG_TAG = OnAlarmReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) 
{       
    msgTxt = "im onReceive...";
    Log.i(LOG_TAG,msgTxt);

    NotificationManager mgr = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent taskEditIntent = new Intent(context, MainActivity.class);

    long taskId = intent.getLongExtra(Intent.EXTRA_TEXT, -1);
    String title = intent.getStringExtra(Intent.EXTRA_TITLE);

    taskEditIntent.putExtra(Intent.EXTRA_TEXT, taskId);

    PendingIntent pi = PendingIntent.getActivity(context,  0,  taskEditIntent,  PendingIntent.FLAG_UPDATE_CURRENT);

    Notification note = new Notification.Builder(context).setContentTitle(
            context.getString(R.string.str_erinnerung))
            .setContentText(title)
            .setContentIntent(pi)
            .setAutoCancel(true)
            .build();

    mgr.notify((int)taskId,note);

}

}

Das hab ich auch aus meinem Buch kopiert.

Aber diese Klasse wird nicht aufgerufen. Ich hatte das so verstanden, dass der Befehl .setReminder(context, taskId, title, c); das alles managt.

Wo ist mein Denkfehler?

Danke! :-)

Ach ja, schade dass hier keiner Glaskugel lesen kann... ;-)

VG,
Eve

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 10:05:41 via Website

HA !

Ich hab jetzt die manifest.xml geändert, und aus .receiver das komplett angegeben, also com.examples. usw.!

Und: tatsächlich, nach 2 Minuten muckte mein Debugger!!! Bin ganz aufgeregt! Mal kucken was jetzt passiert!!!! :-)
....
Also mein Log sagt:
"threadid=3, reacting to signal 3"

?

— geändert am 27.09.2016, 10:07:29

Antworten
swa00
  • Forum-Beiträge: 3.704

27.09.2016, 10:14:24 via Website

Hallo Eve....

ich finde es ja absolut lobenswert, wenn sich jemand hinsetzt und sich einarbeitet.
Aber allerdings habe ich so die leichte Vermutung , dass du das Ganze nur abtippst aber im Grunde genommen
nur Bahnhof verstehst :-)

Du versuchst eben etwas zu Essen zu kochen, wunderst dich aber , dass der Braten so süsslich schmeckt,
denn das Buch hat ein paar seiten später da stehen , dass wir Zimt und Zucker benötigen.

Das war allerdings die Seite mit dem Nachtisch :-)
(Sorry , ein passender Vergleich ist mir eben nicht eingefallen) :-)

So wird das im Allgemeinen mal gar nichts... :-)

Du hast oben X-Fehler drin , ich würde etliche Zeit brauchen , dir zu erklären wo, weshalb und warum
Dass käme einer Schulung gleich.

Ich picke nur mal eine Kleinigkeit heraus :

// Alle 2 Minuten
long interval = DateUtils.MINUTE_IN_MILLIS * 2;

was soll denn das ? alle 2 Minuten ????

Im Grunde genommen solltest du mal einen Reset machen und ganz simple denken :

a) du hast einen Service, der reagiert alle X Stunden auf einen Alarmtrigger
b) und da startest du deine Mainactivity mit meinem Quellcode oben - MEHR nicht

Ich verstehe ehrlich gesagt nicht , was du da alles reinpackst und wer dir denn das empfohlen hat.

Lass mal den ganzen Mist mit Notify und was du alles noch so da reinpackst komplett weg ..
Konzentriere dich auf die oben von mir erwähnten 2 Punkte.

Erst dann , wenn das Gerüst steht kannst du damit anfangen , rosa Wölkchen zu malen .

Also Reset - vorn vorne nochmal beginnen und den abgespeckten code hier posten
(Nicht vorher löschen) :-)

P.S als "Anfänger" mit Services zu arbeiten ist ein recht sportliches Vorhaben - das gehört in die Kathegorie
"absolut fortgeschritten"

lg
Stefan

— geändert am 27.09.2016, 10:26:19

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 10:19:33 via Website

lach

Das mit dem *2 hab ich aus dem Internet, da stand als Kommentar "alle zwei Minuten starten" . Und tatsächlich, nach 2 Minuten tat sich was.

Das mit dem Notification-Zeug steht so in meinem Buch...
Ich will doch gar keine rosa Wölkchen...

Ich kann doch nur das aus dem Buch abschreiben, und wenn das nicht funktioniert, weinen...
lach ich weine natürlich nicht.

Ok, ich specke mal ab (ohne so recht zu wisssen was ich tu...)
:-)

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 10:25:38 via Website

Ganz ehrlich?

Building your first app hab ich schon hinter mir. Meine App läuft ja schon. Ich hab auch schon mal eine App gemacht, die Sachen in eine Datei schreibt und wieder ausliest. Also so ganz bei Adam und Eva möchte ich nicht mehr anfangen...

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 10:32:21 via Website

Noch zu dem "Anfänger" und "Services"

Ja aber irgendwann muss ich doch damit anfangen, oder?
Und wenn ich meine App nun mal an bestimmten Tagen automatisch starten will, dann komm ich wohl an den Services nicht vorbei. So hatte ich das verstanden.

Und ich hab ja ein Buch...

Aber irgendwie...
Naja, schau ma mal.
:-)

Antworten
swa00
  • Forum-Beiträge: 3.704

27.09.2016, 10:33:17 via Website

Ok, Punkt geht an Dich :-)

aber du vermischst jetzt Techniken, die untereinander selten klappen.

Du musst dich jetzt intensiv damit auseinander setzen , was ein Service wirklich macht .
Und ganz wichtig an dem Punkt : du musst wissen was Android mit deiner App und deinen Service macht (Stichpunkt Livecycle)

Bring deinen Service zum laufen und wenn du dann nach deinen X Minuten einen schönen Log ausgegeben bekommst,
dann rufst du erst die MainActivity auf.

P.S achte auch darauf , dass das Ganze beim Neustart des Smartphones auch wieder ausgeführt wird , sonst passiert danach gar nichts (Broadcast)

uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"

schau mal hier
https://developer.android.com/training/scheduling/alarms.html
oder
http://stackoverflow.com/questions/8321443/how-to-start-service-using-alarm-manager-in-android

— geändert am 27.09.2016, 10:41:55

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Eve W.
  • Forum-Beiträge: 23

27.09.2016, 10:36:59 via Website

lach
Ich dachte halt: Buch aufschlagen, Code abschreiben - funktioniert...

Ich danke dir. So machen wir das.
:-)

Antworten
Eve W.
  • Forum-Beiträge: 23

29.09.2016, 15:52:56 via Website

ui bin ich aufgeregt! Bin im Selbsttest!
Eigentlich müsste mein Handy jetzt in 24 Stunden meine APP automatisch starten!

Bin so gespannt ob es klappt!!!!!!!

Vermutlich nicht, aber Vorfreude ist die schönste Freude :-)

Im Debug-Modus hat alles wunderbar funktioniert...

Antworten
Eve W.
  • Forum-Beiträge: 23

03.10.2016, 09:07:55 via Website

Derzeitiger Stand:
hab mein Projekt ins Android Studio importiert und arbeite nicht mehr mit eclipse. Die Debug-Version läuft perfekt. :-)
Allerdings gibt es noch Probleme bzw. eine Frage und ein Problem:

  1. muss ich irgendwas beachten, wenn meine App deinstalliert wird?
    Weil der AlarmManager ja eigentlich im Hintergrund läuft... ? Macht das android automatisch oder muss ich mich selber darum kümmern?

    1. Bei der Installation bekomme ich den Fehler "beim parsen des pakets ist ein problem aufgetreten"
      Ich habe eine nicht-signierte release Version erstellt. Der Haken ist gesetzt bei "Installation von unbekannten Quellen erlauben". Die Debug-Version hatte immer funktioniert...
      ?
      Danke!
      :-)

VG,
Eve

— geändert am 03.10.2016, 09:08:35

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.10.2016, 10:27:14 via App

Hallo Eve!
Zu 1. Da musst du nichts machen, das System merkt das selber.

zu 2. Wenn du seitdem es getan hat nicht falsch programmiert hast sollte es gehen. Allerdings musst du evtl. erst die alte debug verson deinimstallieren und dann erst die neue aufspielen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Eve W.
  • Forum-Beiträge: 23

03.10.2016, 10:41:18 via Website

Ok... alles sehr ominös...

gerade eben hier gefunden:

https://www.nextpit.de/forum/407981/keine-installation-eigener-apk-datei-auf-handy-moeglich

Unsignierte Packete sind natürlich nicht installierbar

Hm.
Also dann mach ich halt mal so eine signierte Datei. Ich dachte für den Betatest sei das nicht nötig. Aber was soll's.

Danke für deine Antwort! Bin froh dass Android selber aufräumt!
:-)

— geändert am 03.10.2016, 10:41:46

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.10.2016, 10:47:57 via App

Du musst nicht signieren nur die alte App nie nicht release compiled wurde vorher von deinem Gerät entfernen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Eve W.
  • Forum-Beiträge: 23

03.10.2016, 10:52:29 via Website

schluchz

das hatte ich gemacht... :-( Hab die alte apk deinstalliert, neues apk rüberkopiert, installiert, dann Fehlermeldung, dann Handy neu gestartet, nochmal probiert zu installieren, wieder Fehlermeldung... :-(

Antworten
Eve W.
  • Forum-Beiträge: 23

03.10.2016, 10:56:11 via Website

hm... ich hatte noch ein altes .apk drauf, als die app noch ihren Arbeitstitel hatte.
Vielleicht hat mir das in die Suppe gespuckt?

Jetzt, die signierte Datei läuft :-)

Antworten