2013-03-25 16 views
5

Ich bin neu in Android-Programmierung. Ich habe einen Empfänger, der einen Dienst beim Booten startet, aber es scheint nie gestartet. Kannst du mir sagen, was ich falsch mache? Ich weiß nicht, wie man es debuggt. Können Sie mir erklären, wie ich Android-Startup-Dienste auch debuggen kann?Android Boot-Dienst startet nie

Hier ist mein Code. Vielen Dank im Voraus

Recibidor.java:

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

public class Recibidor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Iniciando Recibidor", Toast.LENGTH_LONG).show(); 
     final String TAG = "Recibidor"; 
     Log.i(TAG, "Iniciando Recibidor"); 

     if (intent.getAction().equalsIgnoreCase("android.intent.action.BOOT_COMPLETED")) { 
     Toast.makeText(context, "Iniciando Intent", Toast.LENGTH_LONG).show(); 
     Log.i(TAG, "Iniciando Intent"); 

     Intent servicio = new Intent(); 
     servicio.setAction("com.pruebas.Servicio"); 
     context.startService(servicio); 

     Log.i(TAG, "Iniciando Servicio"); 
     Toast.makeText(context, "Iniciando Servicio", Toast.LENGTH_LONG).show(); 
     } 

    } 
} 

Servicio.java

package com.pruebas; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class Servicio extends Service { 
    private final String TAG = "Servicio"; 


    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "ON CREATE"); 
     Toast.makeText(this, "ON CREATE", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i(TAG, "ON DESTROY"); 
     Toast.makeText(this, "ON DESTROY", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     startForeground(0, null); 
     Log.i(TAG, "ON START COMMAND"); 
     Toast.makeText(this, "ON START COMMAND", Toast.LENGTH_LONG).show(); 
     return START_STICKY; 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.pruebas" 
    android:versionCode="1" 
    android:versionName="1.0" 
    android:installLocation="internalOnly" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <application> 
     <service android:name=".Servicio"> 
      <intent-filter> 
       <action android:name="com.pruebas.Servicio"/> 
      </intent-filter> 
     </service> 

     <receiver android:name=".Recibidor" android:enabled="true" android:exported="true" 
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
     </receiver> 

    </application> 

</manifest> 
+0

Erhalten Sie die Absicht in Ihrem Recibidor? – Entreco

+0

Hallo Entreco. Kannst du mir sagen, wie ich wissen kann, ob ich die Absicht bekomme? – eloweyn

+0

Sie können sich anmelden onReceiver-Methode – tundundun

Antwort

4

Der Code, den Sie nie auf neuere Versionen von Android arbeiten gepostet haben wird. Um Malware zu verhindern, ist es in späteren Versionen von Android nicht möglich, eine BroadcastReceiver im Manifest UNTIL automatisch zu registrieren. Der Benutzer hat Ihre App manuell über den App Launcher gestartet.

Sie müssen Activity mit den MAIN/LAUNCHER <intent-filter> Einträgen erstellen. Sobald der Benutzer die App einmal manuell gestartet hat, wird die Manifestregistrierung für Ihre BroadcastReceiver ausgeführt, und sie bleibt registriert, es sei denn, der Benutzer verwendet den Befehl "Kraft anhalten" im Abschnitt "Anwendungen verwalten" in den Einstellungen.

+0

Danke Squonk !! – eloweyn

1

Die Anwendung im internen Speicher installiert werden muss erhalten die Absicht BOOT_COMPLETED. Sehen Sie diese Frage: My BroadcastReceiver is not receiving the BOOT_COMPLETED intent after my N1 boots. Help Please!

+0

android: installLocation = "internalOnly" bedeutet, dass die App nur im internen installiert wird App einmal .. und bitte den Empfänger in sonst zu notieren –

+0

die Anwendung haben das Tag android: installLocation = "internalOnly". Es ist im internen Speicher – eloweyn

0

Try

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

aus "Empfänger" Tag zu bewegen.

http://developer.android.com/guide/topics/manifest/manifest-intro.html#perms

+0

installiert Ich bin ausgezogen und funktioniert immer noch nicht. – eloweyn

+0

Stellen Sie sicher, dass Sie Ihren Service- und Broadcast-Empfänger in das root-Paket setzen. Oder verwenden Sie einfach den vollständig qualifizierten Namen (mit Paket). – tundundun