2014-09-01 13 views
6

Ich habe eine Anwendung, die Sie vollständig und sehr einfach mit dem Code, den ich in dieser Frage veröffentlichen werde, wiederherstellen sollten. Hier ist die Manifest-Datei:Wie starte ich einen IntentService von einem WakefulBroadcastReceiver

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

    <uses-sdk 
     android:minSdkVersion="19" 
     android:targetSdkVersion="21" /> 

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

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

     <activity 
      android:name="com.example.broadcasttest.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver 
      android:name="com.example.broadcasttest.TestReceiver" 
      android:label="@string/app_name" 
      android:enabled="true" > 
     </receiver> 

     <intentservice 
      android:name="com.example.broadcasttest.MonitorService" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="com.example.broadcasttest.MonitorService" /> 
      </intent-filter> 
     </intentservice> 
    </application> 

</manifest> 

Wie Sie sehen können, die enthält eine Tätigkeit, ein (wakeful) Rundfunkempfänger und einen intentservice, alle im gleichen Paket. Die Aktivität wird beim Start, hier ist der Code gestartet:

package com.example.broadcasttest; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 


public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sendBroadcast(new Intent(this, TestReceiver.class)); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

Diese erfolgreich löst die onReceive Funktion von TestReceiver.

package com.example.broadcasttest; 

import android.content.Context; 
import android.content.Intent; 
import android.support.v4.content.WakefulBroadcastReceiver; 

public class TestReceiver extends WakefulBroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //Intent service = new Intent("com.example.broadcasttest.MonitorService"); 
     Intent service = new Intent(context, MonitorService.class); 
     startWakefulService(context, service); 
    } 

} 

Dies ist, wo die Dinge allerdings schief gehen, legte ich einen Haltepunkt in der onReceive Funktion und es wird auf jeden Fall genannt. Die Klasse MonitorService wird jedoch nie erreicht. Ich habe einen Breakpoint in der onHandleEvent Funktion platziert, aber es scheint, dass es nie so weit kommt. Hier ist der Code für diese Klasse:

package com.example.broadcasttest; 

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

public class MonitorService extends IntentService { 

    public MonitorService(String name) { 
     super(name); 
    } 

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

    @Override 
    protected void onHandleIntent(Intent intent) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } finally { 
      TestReceiver.completeWakefulIntent(intent); 
     } 

    } 

} 

Wie Sie aus der kommentierten Zeile in der TestReceiver Klasse sagen kann, ich habe versucht, eine implizite Absicht anstelle eines expliziten verwenden. Ich habe auch this question gelesen und alles versucht, was dort erwähnt wird. Fehle ich hier etwas? Ich betreibe dies auf einem Emulator (Nexus7 API L).

Gibt es etwas, das ich hier vermisse?

+0

Es tut mir Leid, was genau der Zweck dieses Codes ist? Was macht es? –

Antwort

9

Es gibt kein Tag als <intentservice> in Application Manifest. IntentService ist eine Unterklasse von Service, daher müssen Sie sie als Dienst im Manifest deklarieren.


ändern

<intentservice 
    android:name="com.example.broadcasttest.MonitorService" 
    android:enabled="true" > 
     <intent-filter> 
      <action android:name="com.example.broadcasttest.MonitorService" /> 
     </intent-filter> 
</intentservice> 

zu

<service 
    android:name="com.example.broadcasttest.MonitorService" 
    android:enabled="true" > 
     <intent-filter> 
      <action android:name="com.example.broadcasttest.MonitorService" /> 
     </intent-filter> 
</service> 
+0

Danke, wenn ich nur gewusst hätte, dass es so einfach ist. Ich frage mich, warum ich keinen Fehler bekommen habe. – overactor

+0

@overactor Herzlich willkommen :) –