2017-04-12 3 views
0

Ich habe ein Projekt, das nur ein Service ist und keine Aktivität und Benutzeroberfläche hat. Ich möchte meinen Anwendungshintergrunddienst starten, wenn das Telefon vollständig hochfährt. aber ich erhalte nie die "BOOT_COMPLETED" Nachricht von OS. das ist mein Code:Warum Broadcast Receiver nicht für Service-Anwendung Android arbeiten?

Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.droid.arghaman.location_tracker"> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <receiver android:name=".BootBroadcastReceiver" 
    android:enabled="true" 
    android:exported="false" 
    android:label="StartServiceAtBootReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
     <category android:name="android.intent.category.DEFAULT"></category> 
    </intent-filter> 

    </receiver> 
</application> 

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

Broadcast-Empfänger:

public class BootBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("boot Received", intent.getAction()); 
     Intent serviceLuncher = new Intent(context, myService.class); 
     context.startService(serviceLuncher); 
    } 
} 

myService:

public class LocationNotifierService extends Service { 
    Timer timer ; 
    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate(){ 
     timer = new Timer(); 
     timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 

Toast.makeText(getBaseContext(),"Location",Toast.LENGTH_SHORT).show(); 
      } 
      },3000); 
     } 

    @Override 
    public void onDestroy(){ 

    } 
    @Override 
    public int onStartCommand(Intent intent, int flagId, int startId){ 
     return START_STICKY; 
    } 
} 

, aber ich bekomme nie "boot Received" log. gibt es einen Fehler und gibt es eine Möglichkeit, mein Programm zu debuggen?

Ich empfehle, dass mein Projekt nur diesen Dienst und keine UI haben darf.

Antwort

2

ich nie die "BOOT_COMPLETED" Nachricht von OS erhalten

Teils, das ist, weil Sie eingerichtet keinen <receiver> haben android.intent.action.BOOT_COMPLETED zu erhalten Sendungen.

Zum Teil, weil Ihre App keine Broadcasts empfängt, bis etwas auf dem Gerät eine explizite Intent verwendet, um eine Ihrer Komponenten zu starten. Die Art, wie Ihre App — ohne eine Aktivität eingerichtet ist, die der Benutzer ausführen kann — es ist unwahrscheinlich, dass jede App dies tun wird, und so wird der Code nie ausgeführt. Beachten Sie außerdem, dass Android O Änderungen speziell entwickelt hat, um zu verhindern, dass Hintergrunddienste sehr lange laufen, und um die Möglichkeit zu beschränken, Hintergrundstandortaktualisierungen zu erhalten (was Ihr Name location_tracker bedeutet, dass Sie in Zukunft hinzufügen möchten)). Vielleicht möchten Sie sich noch einmal überlegen, ob es klug ist, diese App so zu schreiben, wie Sie es sind.

+0

Ich habe Empfänger in meinem Manifest .... –

+0

Bitte stellen Sie eine Lösung zur Verfügung ... Wie kann ich meinen Dienst ohne Benutzerinteraktion starten ??? –

+0

@ Navid_pdp11: Es gibt im Allgemeinen keine Lösung. Android ist so eingerichtet, dass es Malware-Autoren daran hindert, das zu tun, was Sie vorhaben: verstecken Sie sich vor dem Benutzer und spionieren Sie ihn aus. – CommonsWare

0

versuchen Sie dies in Ihrem Manifest

<receiver android:name=".BootBroadcastReceiver" 
    android:enabled="true" 
    android:exported="false" 
    android:label="StartServiceAtBootReceiver"> 
     <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
+0

... wahrscheinlich diese Zeile entfernen möchten 'android: exported =" false "' - es muss exportiert werden, was bei statischen Empfängern mit Intent-Filtern implizit der Fall ist? –

Verwandte Themen