2

Ich schreibe meinen Code in Android Studio, aber das Projekt, das ich schreibe, hat keine GUI und aktualisiert nie Ansichten für einen Benutzer. Es überwacht einfach die zuletzt installierte App mit einem Broadcast-Empfänger und sendet Informationen an eine andere Java-Datei.Senden von Daten aus BroadcastReceiver zu Aktivität, während App im Hintergrund ist

Ich frage mich, wie ich eine Zeichenfolge von einem Broadcast-Empfänger zu einer Aktivität senden kann (vielleicht sollte dies nicht eine "Aktivität" sondern ein "Dienst" sein?), Und diese Arbeit, während die App im Hintergrund ist.

Gerade habe ich einen Broadcast-Empfänger für die zuletzt installierte App auf meinem Handy (das läuft im Hintergrund). Und ich habe einen benutzerdefinierten Broadcast-Empfänger eingerichtet, um meine Hauptaktivität zu benachrichtigen, wenn der Broadcast-Empfänger eine installierte App erhält. Dieser benutzerdefinierte Empfänger funktioniert jedoch nicht im Hintergrund. Vielleicht sollte ich eine Aktivität nicht verwenden, um Informationen vom BroadcastReceiver zu erhalten?

Gibt es eine Möglichkeit, Informationen von meinem Broadcast-Empfänger zu meiner Hauptaktivität zu senden, während die App im Hintergrund ist? Ich brauche auch meine Hauptaktivität, um normale Funktion fortzusetzen, während ich im Hintergrund bin (es gibt keine GUI-Aktualisierungen, während es im Hintergrund ist).

Mein BroadcastReceiver die Daten meiner Haupttätigkeit durch eine neue Intent

public class NewInstallReceiver extends BroadcastReceiver { 

ApplicationInfo ai; 

@Override 
public void onReceive(Context context, Intent intent) { 

    final PackageManager pm = context.getPackageManager(); 

    try { 

     // if app is added, get package info 

     ai = pm.getApplicationInfo(intent.getData().getSchemeSpecificPart(), 0); 

     Intent i = new Intent("broadcastName"); 
     // Data pass to activity 
     i.putExtra("appInfo", ai); 
     context.sendBroadcast(i); 

    } catch (final PackageManager.NameNotFoundException e) { 
     ai = null; 
    } 
} 

} 

In meinem MainActivity in onCreate sendet registrieren ich den Hörer:

registerReceiver(broadcastReceiver, new IntentFilter("broadcastName")); 

Ich empfange Daten von BroadcastReceiver

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     // get applicationInfo 
     Bundle b = intent.getExtras(); 
     Object applicationInfo = b.get("appInfo"); 

     ApplicationInfo appInfo = (ApplicationInfo) applicationInfo; 

     getNewData(appInfo); 
    } 
}; 

Dann muss ich den Hörer in MainActivity deregistrieren, aber offensichtlich ist dies nicht zulassen, dass mir Informationen von BroadcastReceiver zu erhalten, sobald die App im Hintergrund

geht
@Override 
public void onStop() 
{ 

    try{ 

     unregisterReceiver(broadcastReceiver); 
    } 

    catch(Exception e){ 
     System.out.println("Exception is " + e.toString()); 
    } 

    super.onStop(); 
} 

Antwort

2

Ehrlich gesagt, ich glaube nicht, das Update Eine Aktivität im Hintergrund ist eine gute Übung (auch wenn möglich).

Nach DOCS:

Eine Aktivität ist ein einzelner, fokussierter, was der Benutzer tun kann. Fast alle Aktivitäten interagieren mit dem Benutzer. Daher erstellt die Activity-Klasse ein Fenster für Sie, in dem Sie Ihre Benutzeroberfläche mit setContentView (View) platzieren können. Während Aktivitäten dem Benutzer oft als Vollbild-Fenster präsentiert werden, können sie auch auf andere Arten verwendet werden: als Floating Windows ... oder eingebettet in eine andere Aktivität (mit ActivityGroup).

Wenn also die Aktivität im Hintergrund ist, ist sie nicht sichtbar. Es macht also keinen Sinn, den Inhalt zu aktualisieren (weil er für den Benutzer nicht sichtbar ist).

In der Tat, sollten Sie stattdessen folgendes Verhalten implementieren:

  • Service-Verwenden Sie nur die Informationen zu speichern (in einer Datenbank/Content-Provider) und die Aktivität darüber informiert, dass eine neue Informationen verfügbar sind. Wenn Ihre Aktivität geöffnet ist, werden diese Informationen sofort verbraucht. Wenn Aktivität nicht geöffnet ist, bleiben die Informationen gespeichert, wenn der Benutzer sie benötigt.

  • Wenn die App nur gestoppt wurde, können Sie den Aktivitätsinhalt während der onResume() Methode aktualisieren.

  • Wenn Ihre App gelöscht wurde und der Benutzer sie erneut geöffnet hat, können Sie ALLE Ansichten während der onCreate() Methode aktualisieren. onCreate() wird aufgerufen, bevor die Ansicht dem Benutzer angezeigt wird.

Auf diese Weise werden die Daten aktualisiert werden, wenn erforderlich: , wenn der Benutzer-wan die Informationen zu überprüfen. Sonst ist es Zeitverschwendung.

+0

Vielen Dank für diese Antwort. Ich stimme völlig mit Ihnen. Aber um meine Frage hinzuzufügen, denke ich, dass meine "App" niemals eine GUI benötigt, die der Benutzer sehen kann. In diesem Sinne ist es nicht wirklich eine App, sondern nur ein laufendes Programm, das ich gerade in Android Studio schreibe. Wenn dies der Fall ist, sollte dann meine "MainActivity" in einen Dienst umgewandelt werden? Ist dies die beste Lösung, oder gibt es eine andere Möglichkeit, wenn meine App immer ausgeführt werden muss, um nach installierten Apps zu suchen, und in keiner Ansicht aktualisiert wird? – Natalie

+0

Hmmmm .. Da Sie keine GUI haben, brauchen Sie keine Aktivität ... Vielleicht brauchen Sie nur den Rundfunkempfänger. Der Empfänger erhält die Aktion und erledigt alle Aufgaben, die Sie benötigen .... Wenn Sie alle Aufgaben im Empfänger ausführen können, brauchen Sie den Dienst weder ... – W0rmH0le

+0

Ich werde damit herumspielen. Vielen Dank – Natalie