it-swarm.com.de

Android -Starten des Dienstes zum Startzeitpunkt

Ich muss einen Dienst zum Startzeitpunkt starten. Ich habe viel gesucht. Sie sprechen über Broadcastreceiver. Da ich neu in der Android Entwicklung bin, habe ich kein klares Bild über Dienste auf Android bekommen. Bitte geben Sie einen Quellcode an.

106
harish

Erstellen Sie ein BroadcastReceiver und registrieren Sie es, um ACTION_BOOT_COMPLETED zu erhalten. Sie benötigen außerdem die Berechtigung RECEIVE_BOOT_COMPLETED .

Lesen Sie: Abhören und Senden globaler Nachrichtennd Einstellen von Alarmen

94
Peter Knego

Ihr Empfänger:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

Ihre AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.broadcast.receiver.example"
      Android:versionCode="1"
      Android:versionName="1.0">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name" Android:debuggable="true">

        <activity Android:name=".BR_Example"
                  Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver Android:name=".MyReceiver" Android:enabled="true" Android:exported="false">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- Adding the permission -->
    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>
191
Vladimir Ivanov

Es ist möglich, Ihren eigenen Anwendungsdienst für den automatischen Start zu registrieren, wenn das Gerät gestartet wurde. Sie benötigen dies beispielsweise, wenn Sie Push-Ereignisse von einem http-Server empfangen und den Benutzer informieren möchten, sobald ein neues Ereignis eintritt. Der Benutzer muss die Aktivität nicht manuell starten, bevor der Dienst gestartet wird ...

Es ist ganz einfach. Geben Sie Ihrer App zunächst die Berechtigung RECEIVE_BOOT_COMPLETED. Als nächstes müssen Sie einen BroadcastReveiver registrieren. Wir nennen es BootCompletedIntentReceiver.

Ihre Manifest.xml sollte jetzt so aussehen:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
 package="com.jjoe64">
 <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver Android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action Android:name="Android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service Android:name=".BackgroundService"/>
 </application>
</manifest>

Als letzten Schritt müssen Sie den Receiver implementieren. Dieser Receiver startet nur Ihren Hintergrunddienst.

package com.jjoe64;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.SharedPreferences;
import Android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("Android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

Von http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html

32
appsthatmatter

Bei den meisten hier veröffentlichten Lösungen fehlt ein wichtiger Punkt: Wenn Sie auf eine Aktivierungssperre verzichten, besteht die Gefahr, dass Ihr Dienst vor Abschluss der Verarbeitung beendet wird. Habe diese Lösung in einem anderen Thread gesehen und auch hier geantwortet.

Da WakefulBroadcastReceiver in API 26 veraltet ist, wird empfohlen für API-Levels unter 26

Sie benötigen eine Wecksperre. Glücklicherweise gibt uns die Support Bibliothek eine Klasse um dies zu tun:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

stellen Sie dann in Ihrem Service sicher, dass Sie die Aktivierungssperre aufheben:

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

Vergessen Sie nicht, die Berechtigung WAKE_LOCK hinzuzufügen und Ihren Empfänger im Manifest zu registrieren:

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

...

<service Android:name=".SimpleWakefulReceiver">
    <intent-filter>
        <action Android:name="com.example.SimpleWakefulReceiver"/>
    </intent-filter>
</service>
15
phreakhead

sie sollten sich sowohl für BOOT_COMPLETE als auch für REBOOT registrieren

<receiver Android:name=".Services.BootComplete">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <action Android:name="Android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver> 
5

Registrieren Sie Ihren erstellten Dienst auch im Manifest und verwenden Sie die Berechtigung als

<application ...>
   <service Android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action Android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>

und dann in braod cast Reciever Ihren Dienst anrufen

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}
1
SoftEye

Registrieren Sie zuerst einen Empfänger in Ihrer manifest.xml-Datei:

    <receiver Android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action Android:name="Android.intent.action.ACTION_POWER_CONNECTED" />
            <action Android:name="Android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

und dann schreibe eine Sendung für diesen Receiver wie:

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {



        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}
0
Manoj Tarkar