1

Ich baue einen Dienst, um Absicht von FirebaseMessagingService abfangen zu können.Broadcast-Empfänger nicht im IntentService empfangen

Die erste Version, die ich verwendet habe, um es auf App-Ebene in der Hauptaktivität zu tun, aber ich möchte nicht mehr auf dieser Ebene damit umgehen. Ich habe eine Absicht Service wie unten erstellt:

package com.seb.sebastien.appservices; 

import android.app.IntentService; 
import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.content.Context; 
import android.content.IntentFilter; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class appsControlIntentService extends IntentService { 
    public static final String REQUEST_MSG = "request"; 
    public static final String RESPONSE_MSG = "response"; 
    public static final String TAG = "appsControlIntentService"; 
    private String type_sim; 


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

    @Override 
    protected void onHandleIntent(Intent intent) { 

     boolean request = intent.getBooleanExtra(REQUEST_MSG, false); 

     if(request == true) { 
      sendResponse("Enable"); 
      handleAction(getCarrier()); 
      registerAllReceivers(); 
     } 
     else if (request == false) { 
      sendResponse("Disable"); 
      unRegisterAllReceivers(); 
      disableAction(); 
     } 
     else 
      Log.e(TAG, "Error msg"); 

    } 
    ... 

    /* Firebase and SIM */ 
    private BroadcastReceiver serviceBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG, "Broadcast received"); 
      if (intent.getExtras().getString(appFirebaseMessagingService.FIREBASE).equals(appFirebaseMessagingService.FIREBASE)) 
       type_sim = intent.getExtras().getString(appFirebaseMessagingService.SIM_TYPE); 
      else if(intent.getExtras().getString(SimNotificationService.EXTRA_SIM_STATE) != null) 
       Log.d(TAG, "Get something from Sim"); 
      else 
       type_sim = null; 

      if(type_sim != null){ 
       handleAction(type_sim); 
      } 
     } 
    }; 

    private void registerAllReceivers(){ 
     Log.d(TAG, "Broadcast receiver register"); 
     registerReceiver(serviceBroadcastReceiver, new IntentFilter(appFirebaseMessagingService.INTENT_FILTER)); 
    } 

    private void unRegisterAllReceivers() { 
     if (serviceBroadcastReceiver != null) { 
      unregisterReceiver(serviceBroadcastReceiver); 
      serviceBroadcastReceiver = null; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     unRegisterAllReceivers(); 
     super.onDestroy(); 
    } 

} 

diese Absicht Dienst einen Rundfunkempfänger registrieren, um die Feuerbasis Sendung zu empfangen, wie unten dargestellt:

package com.seb.sebastien.appservices; 

public class appFirebaseMessagingService extends FirebaseMessagingService { 

    public static final String TAG = "appFirebaseMessagingService"; 
    public static final String INTENT_FILTER = "INTENT_FILTER"; 
    public static final String FIREBASE = "firebase"; 
    public static final String SIM_TYPE = "simtype"; 

    public appFirebaseMessagingService() { 
    } 

    /* @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } */ 

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 

     String sim = null; 

     Log.d(TAG, "From: " + remoteMessage.getFrom()); 

     if (remoteMessage.getData().size() > 0) { 
      Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
     } 

     // Check if message contains a notification payload. 
     if (remoteMessage.getNotification() != null) { 
      sim = remoteMessage.getNotification().getBody(); 
      Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
     } 

     Intent intent = new Intent(INTENT_FILTER); 
     intent.putExtra(FIREBASE, FIREBASE); 
     intent.putExtra(SIM_TYPE, sim); 

     sendBroadcast(intent); 

    } 
} 

wenn das Debuggen, sah ich, dass wir gingen bis zum sendBroadcast aber nichts scheint im Klassenereignis "appControlIntentService" angekommen zu sein, wenn ich den Empfänger registriert habe.

Eine Idee, warum die Übertragung nicht im Intentservice empfangen wird?

Antwort

1

Zunächst einmal, nicht sicher, wo Sie tatsächlich eine Instanz Ihrer appsControlIntentService erstellt.

Zweitens wird IntentService gestoppt, wenn onHandleIntent beendet wird. Es soll eine kurze Aufgabe erledigen und beenden. Also im Grunde, selbst wenn Sie eine erstellt haben, um die Sendung zu hören, würde es nur für eine sehr begrenzte Zeit tun, bis es onDestroy aufgerufen wurde.

über BroadcastReceiver Lösungen für zu Ihrem benutzerdefinierten Vorsatz hören:

1) einen Dienst machen, die im Hintergrund läuft (nicht IntentService, regelmäßiger Service) zur Verfügung und ein Broadcast registrieren. Dieser Dienst können Sie erstellen, wenn Ihre Aktivität zum ersten Mal gestartet wird, und wahrscheinlich im Boot BroadcastReceiver. Entscheiden Sie, ob es ein Vordergrund- oder Hintergrunddienst sein soll. Hintergrunddienste werden aufgrund von Speicherproblemen eher vom Betriebssystem gelöscht. Bei Vordergrunddiensten muss jedoch ein Symbol in der Statusleiste angezeigt werden.

2) Legen Sie einfach den BroadcastReceiver in das Manifest. Auf diese Weise wird das Betriebssystem sogar die App wecken, um die Sendung zu behandeln, wenn sie ankommt. Auch wenn die App gerade nicht läuft. werfen Sie einen Blick auf "Manifest deklarierte Empfänger" in: https://developer.android.com/guide/components/broadcasts.html.

, um diesen Empfänger zu deaktivieren, sehen Sie sich an: Android - how to unregister a receiver created in the manifest?. oder Sie können in den freigegebenen Einstellungen speichern, ob Sie etwas mit dem Ereignis tun möchten oder noch besser, senden Sie die Absicht nicht aus dem FirebaseMessagingService, wenn sie an erster Stelle deaktiviert ist.

+0

Danke, aber in diesem Fall, wie ich etwas im Hintergrund laufen für Broadcast hören haben kann? Ich dachte, mit Absicht Service, denken Sie, ein Service wäre besser. ? Das Ziel besteht darin, einige Apps basierend auf der Firebase-Nachricht zu deaktivieren. Zum Beispiel werfen Firebase eine messsge mit einem Körper, die «disable» enthalten, sobald sie vom Dienst empfangen werden, wird eine Anwendung durch diesen Dienst deaktiviert. – Seb

+0

Ich habe meine Antwort bearbeitet, um sie zu klären –

0

Sie sollten Alarmmanager für Rundfunkempfänger wie diese verwenden -

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     Intent alarmIntent = new Intent(MainActivity.this, BroadCastReciever.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, 
       alarmIntent, 0); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
        + duration(in millisecond), pendingIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
        + in millisecond, pendingIntent); 

     }