Android Code in Standby Hintergrund laufen lassen

S

SebiSchwarz

Neues Mitglied
0
Hallo.

Also ich will ein eigene Alarm Uhr App bauen, das er auch in Hintergrund Standby weiter laufen soll. Das soll natürlich unter C# mit Xamarin sein.

Und damit möchte ich dass wenn ich auf Button klicke, das dann diese Code auch in Standby Hintergrund laufen wird:
Code:
             //myTimer.Interval = 1000; // 1 Sekunde
            //myTimer.Elapsed += Button_Click;
            //myTimer.AutoReset = true;
            //myTimer.Enabled = true;
           
        private void Button_Click(object sender, EventArgs e)
        {
            myTimer.Start();
            TextView Label1 = FindViewById<TextView>(Resource.Id.textView1);
            Label1.Text = Zahl.ToString();
            Zahl++;
            Task.Delay(10).Wait(1);
        }
 
Zuletzt bearbeitet:
@SebiSchwarz
Also ich will ein eigene Alarm Uhr App bauen, das er auch in Hintergrund Standby weiter laufen soll.

Das ist grundsätzlich nicht möglich (oder nur mit trickreichem Aufwand) , da die LifeCycle greift und die App im Hintergrund vom Betriebssystem dann beendet wird, wenn es das für notwendig hält.
The activity lifecycle | Android Developers

Auch ein Foregroundservice wird mittlerweile beendet.
Foreground services | Android Developers

Du kannst für eine bestimmte Zeit z.b. den AlarmManager nehmen , der aber auch je nach Hersteller und Betriebssystem nach einer unbestimmten Zeit nicht mehr ausgeführt wird.
https://developer.android.com/reference/android/app/AlarmManager
Abhilfe dann dazu wäre z.b. ein HeartBeat mit einer High Priority FCM /HMS

Ein weiterer Punkt wäre die BatteryOptimation Settings Permission .
Diese darf allerdings bei Apps , die in den Playstore geladen werden - nur gegen vorherige Genehmigung von Google
erfolgen. - Sonst würde sie Suspended werden
 
Zuletzt bearbeitet:
Kannst du mir ein C# beispiel code geben? Denn ich möchte das der Integer Variable auch in Standby Hintegrund weiter gezählt wird.
 
Das ist nicht eben in "ein paar Zeilen" umgesetzt - das sind schon einige Threads für notwendig .

Du müsstest auch die Standard Funktionen der API verwenden - Welchen Wrapper da für C# angedacht ist , vermag ich nicht zu beurteilen, da ich grundsätzlich nur native Apps schreibe. (Und es kommt auf deine Umgebung an)

Ich vermute allerdings stark , dass das nicht mit C# gehen wird, da du nah am System arbeiten musst und dies Versionsabhängig umsetzen musst.

Die Links zu der API : Siehe oben

Für FCM / HMS benötigst du einen Server und einen Account bei Firebase

Kleine Anmerkung : Im DOZE Mode wird deine App gar nicht mehr laufen , wenn du kein FCM benutzt.
(Also Zustand nach ca 5-10 Minuten ohne Benutzung und Stromzufuhr)
 
Zuletzt bearbeitet:
swa00 schrieb:
Du müsstest schon die Standard Funktionen der API verwenden - welchen Wrapper da für C# angedacht ist , vermag ich nicht zu beurteilen, da ich grundsätzlich nur native Apps schreibe. (Und es kommt auf deine Umgebung an)

Ich vermute allerdings stark , dass das nicht mit C# gehen wird, da du nah am System arbeiten musst und dies Versionsabhängig umsetzen musst.

Die Links zu der API : Siehe oben

Für FCM / HMS benötigst du einen Server und einen Account bei Firebase
Ok.

Ich hab erstmal das hier probiert:
Mainactivity.cs
C#:
using Android.App;
using Android.App.Job;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Service.Carrier;
using Android.Widget;
using AndroidX.AppCompat.App;
using AndroidX.Core.App;
using Java.Util;
using System;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using Xamarin.Essentials;
using static Android.Bluetooth.BluetoothClass;
using Service = Android.App.Service;
using Timer = System.Timers.Timer;

namespace Gehrin_Radiosender_Modus
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        private const int ServiceId = 1001;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);

            SetContentView(Resource.Layout.activity_main);
            Intent serviceIntent = new Intent(this, typeof(Hintergrund_Service));
            StartService(serviceIntent);

            StartService(new Intent(this, typeof(Hintergrund_Service)));

        }

        public void StartTimer(TimeSpan interval, Func<bool> callback)
        {
            var handler = new Handler(Looper.MainLooper);
            handler.PostDelayed(() =>
            {
                if (callback())
                    StartTimer(interval, callback);

                handler.Dispose();
                handler = null;
            }, (long)interval.TotalMilliseconds);
        }

        private void StartService(object sender, EventArgs e)
        {

        }

        private void StopService(object sender, EventArgs e)
        {

        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
        public int Zahl = 0;

        private void Button_Click(object sender, EventArgs e)
        {

           // myTimer.Start();
            //TextView Label1 = FindViewById<TextView>(Resource.Id.textView1);
            //Label1.Text = Zahl.ToString();
            //Zahl++;
            //Task.Delay(10).Wait(1);
            //Vibration_Starten(1);
        }

    }

}

Dann habe für Backorund Service habe ich ein Klasse erstellt namens "Hintergrund_Service":
C#:
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Timers;
using Xamarin.Essentials;
using static System.Net.Mime.MediaTypeNames;


namespace Gehrin_Radiosender_Modus
{
    internal class Hintergrund_Service : Service
    {
        private MainActivity activity;
        System.Timers.Timer myTimer = new System.Timers.Timer();

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            myTimer.Interval = 1000; // 1 Sekunde
            myTimer.Elapsed += Geklickt;
            myTimer.AutoReset = true;
            myTimer.Enabled = true;
            myTimer.Start();

            try
            {
                // Use default vibration length
                Vibration.Vibrate();

                // Or use specified time
                var duration = TimeSpan.FromSeconds(1);
                Vibration.Vibrate(duration);
            }
            catch (FeatureNotSupportedException ex)
            {
                // Feature not supported on device
            }
            catch (Exception ex)
            {
                // Other error has occurred.
            }

            // Code hier, der ausgeführt werden soll, wenn der Dienst gestartet wird
            // Beispielsweise einen Timer starten, um regelmäßig eine bestimmte Aktion auszuführen
            return StartCommandResult.Sticky;
            
        }
        int Zahl = 0;
        private void Geklickt(object sender, EventArgs e)
        {
            Zahl++;
            var toast = Toast.MakeText(ApplicationContext, Zahl.ToString(), ToastLength.Short);
            toast.Show();
            TextView Label1 = activity.FindViewById<TextView>(Resource.Id.textView1);
            Label1.Text = "Hintergrund Service Modus: " + Zahl.ToString();
        }
        
        public override IBinder OnBind(Intent intent)
        {
            return null;
            
        }

        public override bool OnUnbind(Intent intent)
        {
            return base.OnUnbind(intent);
        }

        public override void OnDestroy()
        {
            // Ressourcen freigeben, die der Dienst verwendet
            // Beispielsweise einen Timer stoppen
            myTimer.Stop();
            base.OnDestroy();
        }

    }
}

Diese ganze Methode hat mir die ChatGPT beigebracht. Nur angeblich sollte beim Starten schon die Code von "public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)" aus der Hintergrund_Service Klasse ausgeführt werden, doch das tut er leider nicht. Denn das wird gar nicht ausgeführt.

Und ja ich habe auf AndroidMainfest.xml sieht es so aus:
XML:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          android:versionCode="1"
          android:versionName="1.0"
          package="com.companyname.gehrin_radiosender_modus">
  <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="31" />
  <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
    <service android:name="Hintergrund_Service" />
  </application>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.VIBRATE" />
</manifest>
Denn da ist schon der "<service android:name="Hintergrund_Service" />" eingetragen.

Also wo liegt denn der Fehler im Code? Weil laut ChatGPT Künstliche Intelligent, soll angeblich alles richtig sein.

Und wenn du mir sagst, dass Standby Hintergrund in C# nicht möglich ist, dann wie habe trotzdem viele Android App Entwicker geschaft dass z. B. Whatsapp trotzdem in Standby Hintegrundläuft (wie beim Telefonieren) oder dass Android Alarm Uhr auch im Hintergrund Standby läuft? Und welche API muss ich genau verwenden? Muss ich wirklich ernsthaft auf Android Studio umsteigen? Denn ich kenn mich meistens leider nur mit C# aus, und nicht mit Java.
 
ChatGPT hat es nicht all zu verkehrt gemacht ,- aber leider völlig am Thema vorbei

Die App wird dennoch beendet , denn ChatGPT berücksichtigt NICHT die LifeCyle Optionen , die du ja schliesslich umsetzen möchtest. (Dein Counter soll ja weiterlaufen -> Dein Ziel)
(Aber das habe ich auch schon oben geschrieben )

Und wenn du mir sagst, dass Standby Hintergrund in C# nicht möglich ist, dann wie habe trotzdem viele Android App Entwicker geschaft dass z. B. Whatsapp trotzdem in Standby Hintegrundläuft (wie beim Telefonieren) oder dass Android Alarm Uhr auch im Hintergrund Standby läuft? Und welche API muss ich genau verwenden? Muss ich wirklich ernsthaft auf Android Studio umsteigen? Denn ich kenn mich meistens leider nur mit C# aus, und nicht mit Java.

Nein, habe ich nicht geschrieben !
Ich habe gesagt , dass du den entsprechenden API-Wrapper verwenden solltest , ich kann aber nicht sagen , ob es den in C# gibt.

Whatsapp trotzdem in Standby Hintegrundläuft
"Läuft" es nicht - das ist ein Trugschluss - Whatsapp ist FCM / HMS gesteuert , Threma z.b. MQTT(ähnlich) und Alarmgesteuert.

Grundsätzlich ist ChatCGP oder OpenAI NUR als Anhaltspunkt zu sehen - niemals als laufender Code.
Denn Beide berücksichtigen nicht dein Ziel und das Device .
 
Zuletzt bearbeitet:
@swa00 Ok dann weißt du wie ich das wenigstens mit FCM / HMS umsetzen kann? Dass mein Code Hintergrund in Standby über FCM / HMS läuft?
 
Wie schon oben geschrieben : Einen Firebase Account anlegen ..
Für FCM / HMS benötigst du einen Server und einen Account bei Firebase

Und dann gibt es dort X Beispiele
Firebase Cloud Messaging

Mit FCM startest du dann den ALarmanager, wenn die App vom System abgeschossen wurde
 
Zuletzt bearbeitet:
@swa00 Aber nicht das solche Methode dann internet verbindung erfordert? Denn diese App soll unterwegs Offline laufen.
 
Aber nicht das solche Methode dann internet verbindung erfordert?

Liest Du dir eigentlich die API Links von oben durch und verstehst sie auch ?
Überlege doch bitte einmal, was FCM und eine Push ist und warum ich oben erwähnte , dass man dafür einen Server benötigt ..

Ich denke, mehr muss man auf deinen letzten Beitrag nicht eingehen.
 
Zuletzt bearbeitet:

Ähnliche Themen

D
Antworten
23
Aufrufe
2.791
Data2006
D
OnkelLon
Antworten
13
Aufrufe
2.031
OnkelLon
OnkelLon
M
Antworten
4
Aufrufe
1.191
swa00
swa00
Zurück
Oben Unten