2016-06-19 14 views
0

Ich bin neu in Android-Entwicklung, und ich versuche, eine einfache "Proof of Concept-Anwendung" zu erstellen, die als Hintergrunddienst ausgeführt wird. Ich versuche, IntentService mit einem BroadcastReceiver zu verwenden, um den Prozess zu starten (während der Boot-Zeit für jetzt, könnte ich es irgendwann auf Screen on/user present umstellen).Warum startet mein BroadcastReceiver nicht auf dem Android-Emulator?

Ich habe ein neues Projekt in Android Studio ohne Aktivität erstellt. Dann habe ich die folgenden Java-Dateien hinzugefügt und die folgenden Änderungen an der AndroidManifest.xml vorgenommen.

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.circlesquires.netcountable.netcountable"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <service android:name=".SnapshotService" android:exported="true"> 
     </service> 
     <receiver android:name=".ServiceStarter" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

ServiceStarter.java

package com.circlesquires.netcountable.netcountable; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

/** 
* Created by camha on 6/18/2016. 
*/ 
public class ServiceStarter extends BroadcastReceiver{ 
    static final String ACTION = "android.intent.action.BOOT_COMPLETED"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("output", "onReceive occured!"); 

     if(intent.getAction().equals(ACTION)) { 
      Intent serviceIntent = new Intent(context, SnapshotService.class); 

      context.startService(serviceIntent); 
     } 
    } 
} 

SnapshotService.java

package com.circlesquires.netcountable.netcountable; 

import android.app.IntentService; 
import android.content.Intent; 
import android.util.Log; 

/** 
* Created by camha on 6/18/2016. 
*/ 
public class SnapshotService extends IntentService { 

    public SnapshotService() { 
     super("SnapshotService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent workIntent) { 
     while(true) { 

      Log.i("output", "I'm running!"); 

      try { 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

I Stellen Sie die Anwendung auf einem Emulator sicher zu sein, die "Debug" klicken . Ich sehe jedoch KEINES der in logcat ausgegebenen Protokolle.

Ich bin mir sicher, dass ich etwas falsch mache - hilf mir herauszufinden, was: D. Vielen Dank!

+0

Ihre Anwendung braucht eine 'Activity' hat, dass Sie mindestens einmal nach der Installation starten Sie es von dem _stopped_ Zustand heraus zu bringen. Bis dahin wird Ihr Boot-Receiver die Übertragung nicht geliefert (seit API 3.1). –

+0

Okay, wenn ich eine Aktivität hinzufüge, muss sie nur einmal ausgeführt werden (egal, ob das Telefon neu startet usw.) – CamHart

+0

Ja, im Grunde muss es nach der Installation einmal ausgeführt werden. Es kann jedoch wieder in den _stopped_Status versetzt werden - z. B. wenn der Benutzer Ihre App zwangsweise aus den Einstellungen anhält - in diesem Fall müssten sie ihn erneut ausführen, damit der Boot Receiver funktioniert. Einfaches Neustarten bringt es jedoch nicht in den Zustand _stopped_ zurück. –

Antwort

0

android.intent.action.BOOT_COMPLETED ist senden, wie der Name vermuten, nach, aber nur nach einem Gerät Boot-Zeit. Starten Sie Ihr Gerät neu?

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n <your.package.name>/.<YourReceiverClass> 

Sie können mehr Informationen finden here:

Statt Gerät neu zu starten Ihre Anwendung zu testen, können Sie System Sendungen direkt über adb senden.

0
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     Intent i = new Intent(context, SnapshotService.class); 
     context.startService(i); 
    } 

mit Absicht Wert direkt vergleichen statt String machen und eine Sache mehr

auf Android 3.1 und höher, muss der Benutzer einen Ihrer Aktivitäten vor einem offensichtlichen registrierten BroadcastReceiver starten wird funktionieren. Kontrolle diese https://stackoverflow.com/a/17067671/3288890

+0

Guter Punkt, aber Log.i ("Ausgabe", "onReceive aufgetreten!"); kommt nie vor. – CamHart

+0

hast du das in deinem Handy versucht – Adiii

Verwandte Themen