0

(HINWEIS, dass ich am Ende dieser Frage haben eine EDIT, in dem ich eine Methode mit ersetzt haben, was die Antwort sagte zu tun, um das Problem zu beheben von onReceive nie und hinzugefügt onDestroy zu beheben ein neues Problem, das aufgetaucht nach dem fixieren erstes Problem genannt zu werden. )IntentService nicht sendet aber OnReceive erhält keine Sendung

Hier ist, wie ich die Rundfunkdaten zu erfassen versucht, aber onReceive bekommt nie da Log.w nie etwas zeigt genannt :

public class MatchesActivity extends Activity implements DatabaseConnector.DatabaseProcessListener 
{ 
    public static String SOME_ACTION = "com.dslomer64.servyhelperton.SOME_ACTION"; 
    public static String STRING_EXTRA_NAME = "match"; 

    @Override protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 

    LocalBroadcastManager.getInstance(this).registerReceiver 
    (
     new BroadcastReceiver() 
     { 
      @Override public void onReceive(Context context, Intent intent) 
      { 
       String s = txaMatches.getText().toString() + intent.getStringExtra(STRING_EXTRA_NAME) ; 
       txaMatches.setText(s); 
       Log.w("MatchesActivity","`````onReceive <" + s + ">"); 
      } 
     }, new IntentFilter(SOME_ACTION) 
    ); 
    ... 
    DatabaseConnector dbc = new DatabaseConnector(getApplicationContext(), assets); 
    dbc.setDbProcesslistener(this); // set way to know matches has been defined 
    dbc.findDBMatches(); 
    } // end onCreate 
} // end MatchesActivity 

Datenbank-Anschluss:

public DatabaseConnector(Context _context, AssetManager _assets) 
{ 
    mContext = _context; 

//This method, called in `MatchesActivity` on button press, does start the service: 

    public void findDBMatches() 
    { 
    Intent i= new Intent(mContext, QueryDB.class); 
    mContext.startService(i); 
    } 

    // Here's the service: 

    public static class QueryDB extends IntentService 
    { 
    public QueryDB()   { super(QueryDB.class.getSimpleName()); } 
    public QueryDB(String name) { super(name); } 

//Here's the procedure that does all the work (and it does execute): 

    @Override protected void onHandleIntent(Intent intent) 
    { ... 
     publishProgress(dicWord); // a String 
    } 

    //This does execute but it doesn't send `progress` back to `MatchesActivity`, 
    //which initiated request for service (note: `publishProgress` is so named 
    //because `QueryDB` used to be an `AsyncTask` and I just didn't change the name): 

    protected void publishProgress(String progress) 
    { 
     Intent intent = new Intent(MatchesActivity.SOME_ACTION); 
     intent.putExtra(MatchesActivity.STRING_EXTRA_NAME, progress); 

     this.sendBroadcast(intent); // THIS LINE IS THE PROBLEM, FIXED BELOW 

     Log.w("DatabaseConnector", "`````publishProgress <" + progress + ">"); 
    } 
} 

Welche Verbindung (en) habe ich versäumt zu machen?

EDIT

Dies ist die KORRIGIERT Methode nur oben gefunden:

protected void publishProgress(String progress) 
    { 
     Intent intent = new Intent(MatchesActivity.SOME_ACTION); 
     intent.putExtra(MatchesActivity.STRING_EXTRA_NAME, progress); 

     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 
} 

Hier ist onDestroy in MatchesActivity (die den Dienst gestartet wird), notwendig zu rufen, wenn Dienst seine Arbeit beendet hat:

@Override protected void onDestroy() 
    { 
    super.onDestroy(); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    } 

Beachten Sie, dass sich onDestroy auf eine neuebeziehtVariable, definiert als:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() 
    { 
    @Override public void onReceive(Context context, Intent intent) 
    { 
     String s = intent.getStringExtra(STRING_EXTRA_NAME) ; 
     txaMatches.append(s + "\n"); 
    } 
    }; 

Und onCreate in MatchesActivity bekam einfacher, weil die Definition mMessageReceiver:

@Override protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 

    LocalBroadcastManager.getInstance(this).registerReceiver 
    (
     mMessageReceiver, new IntentFilter(SOME_ACTION) 
    ); 
    } 

Antwort

1

Welche Verbindung (en) habe ich versäumt zu machen?

In Ihrem ersten Codeblock verwenden Sie LocalBroadcastManager. In Ihrem zweiten Codeblock sind Sie nicht.

ersetzen:

this.sendBroadcast(intent); 

mit:

LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
+0

@ CommonsWare - Recht auf das Geld. Ich war so nah und das ist so offensichtlich. Ah, gut. Vielen Dank. Nochmal. – DSlomer64

+0

Wow. Das ist toll. App macht genau das, was ich will (soweit). und es war SO EINFACH, von 'AsyncTask' zu' IntentService' zu ​​wechseln. Es scheint, keine Unterbrechung kann es aufhalten. Wir werden sehen. Ich werde einen Kommentar hinzufügen, wenn etwas Unvorhergesehenes auftritt. – DSlomer64

+0

Eine sehr wichtige Aufgabe, der ich mich nicht widmete, ist "unregisterReceiver". Folglich enthielten nachfolgende Läufe doppelte Ausgabezeilen - alles korrekt, nur so oft angezeigt, wie ich "den Knopf gedrückt" hatte, um eine neue Suche durchzuführen. Um dies zu tun, musste ich eine Variable 'mReceiver' erstellen und die Registrierung in' onDestroy' aufheben. – DSlomer64