Android entspricht NSNotificationCenter

In dem Prozess der Portierung einer iPhone-Anwendung auf Android, ich bin auf der Suche nach dem besten Weg, um innerhalb der App zu kommunizieren. Absicht scheint der Weg zu gehen, ist das die beste (nur) Option? NSUserDefaults scheint viel leichteres Gewicht als Intents in Performance und Codierung.

Ich sollte auch hinzufügen, ich habe eine Anwendung Unterklasse für Staat, aber ich muss eine andere Aktivität bewusst sein, ein Ereignis.

  • NetzwerkOnMainThreadException
  • Passcode-Sperre für Android-Anwendung implementieren
  • Kann kein Fragment nach Tag finden
  • ListFragment-Layout aus xml
  • Was ist die Beziehung zwischen Aufgabe und Rückenstapel
  • XMPP (Openfire) Push Notifications Android
  • Erstellen Sie ListView programmgesteuert
  • Bereitstellung von Gradle-Abhängigkeit ist AAR nicht JAR
  • Android Lint-Bericht nur für mein Projekt, ohne Bibliotheksprojekte?
  • Wie man den Rundfunkempfänger aus der Benachrichtigung auslöst
  • Halten Sie den androiden Knopf aus
  • Button Hervorhebung Verhalten geändert auf Froyo?
  • 6 Solutions collect form web for “Android entspricht NSNotificationCenter”

    Das beste Äquivalent, das ich gefunden habe, ist LocalBroadcastManager, das Teil des Android Support Package ist .

    Aus der LocalBroadcastManager-Dokumentation:

    Helfer zu registrieren und senden Sendungen von Intents zu lokalen Objekten in Ihrem Prozess. Dies hat eine Reihe von Vorteilen gegenüber dem Senden von globalen Sendungen mit sendBroadcast (Intent):

    • Sie wissen, dass die Daten, die Sie senden, Ihre App nicht verlassen werden, also brauchen Sie sich keine Sorgen um leckende private Daten zu machen.
    • Es ist nicht möglich für andere Anwendungen, diese Sendungen an Ihre App zu senden, also müssen Sie sich keine Sorgen um Sicherheitslücken machen, die sie ausbeuten können.
    • Es ist effizienter als das Senden einer globalen Sendung durch das System.

    Wenn Sie dies verwenden, können Sie sagen, dass eine Intent ein Äquivalent zu einer NSNotification . Hier ist ein Beispiel:

    ReceiverActivity.java

    Eine Aktivität, die für Benachrichtigungen für die Veranstaltung mit dem Namen "custom-event-name" .

     @Override public void onCreate(Bundle savedInstanceState) { ... // Register to receive messages. // This is just like [[NSNotificationCenter defaultCenter] addObserver:...] // We are registering an observer (mMessageReceiver) to receive Intents // with actions named "custom-event-name". LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name")); } // Our handler for received Intents. This will be called whenever an Intent // with an action named "custom-event-name" is broadcasted. private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Get extra data included in the Intent String message = intent.getStringExtra("message"); Log.d("receiver", "Got message: " + message); } }; @Override protected void onDestroy() { // Unregister since the activity is about to be closed. // This is somewhat like [[NSNotificationCenter defaultCenter] removeObserver:name:object:] LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); super.onDestroy(); } 

    SenderActivity.java

    Die zweite Aktivität, die Benachrichtigungen sendet / sendet.

     @Override public void onCreate(Bundle savedInstanceState) { ... // Every time a button is clicked, we want to broadcast a notification. findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendMessage(); } }); } // Send an Intent with an action named "custom-event-name". The Intent sent should // be received by the ReceiverActivity. private void sendMessage() { Log.d("sender", "Broadcasting message"); Intent intent = new Intent("custom-event-name"); // You can also include some extra data. intent.putExtra("message", "This is my message!"); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } 

    Mit dem obigen Code wird jedes Mal, wenn die Schaltfläche R.id.button_send angeklickt wird, eine Absicht gesendet und von mMessageReceiver in ReceiverActivity empfangen.

    Die Debug-Ausgabe sollte so aussehen:

     01-16 10:35:42.413: D/sender(356): Broadcasting message 01-16 10:35:42.421: D/receiver(356): Got message: This is my message! 

    Sie könnten dies verwenden: http://developer.android.com/reference/android/content/BroadcastReceiver.html , die ein ähnliches Verhalten gibt.

    Sie können Empfänger programmgesteuert über Context.registerReceiver (BroadcastReceiver, IntentFilter) registrieren und es werden Intents erfassen, die durch Context.sendBroadcast (Intent) gesendet werden.

    Beachten Sie jedoch, dass ein Empfänger keine Benachrichtigungen erhält, wenn seine Aktivität (Kontext) pausiert wurde.

    Ich habe festgestellt, dass die Verwendung von EventBus von Guava lib der einfachste Weg für die Veröffentlichung-Subskriptions-Kommunikation zwischen Komponenten ist, ohne dass die Komponenten explizit miteinander registriert werden müssen

    Siehe ihre Stichprobe auf https://code.google.com/p/guava-libraries/wiki/EventBusExplained

     // Class is typically registered by the container. class EventBusChangeRecorder { @Subscribe public void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); } // somewhere during initialization eventBus.register(this); } // much later public void changeCustomer() { eventBus.post(new ChangeEvent("bla bla") ); } 

    Sie können diese lib einfach auf Android Studio hinzufügen, indem Sie eine Abhängigkeit zu Ihrem build.gradle hinzufügen:

     compile 'com.google.guava:guava:17.0' 

    Hier ist etwas ähnliches wie @Shiki Antwort, aber aus dem Winkel von iOS Entwickler und Notification Center.

    Erstellen Sie zunächst einen NotificationCenter-Dienst:

     public class NotificationCenter { public static void addObserver(Context context, NotificationType notification, BroadcastReceiver responseHandler) { LocalBroadcastManager.getInstance(context).registerReceiver(responseHandler, new IntentFilter(notification.name())); } public static void removeObserver(Context context, BroadcastReceiver responseHandler) { LocalBroadcastManager.getInstance(context).unregisterReceiver(responseHandler); } public static void postNotification(Context context, NotificationType notification, HashMap<String, String> params) { Intent intent = new Intent(notification.name()); // insert parameters if needed for(Map.Entry<String, String> entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); intent.putExtra(key, value); } LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } } 

    Dann brauchst du auch einen enum-Typ, um Fehler bei der Codierung mit Strings zu sichern – (NotificationType):

     public enum NotificationType { LoginResponse; // Others } 

    Hier ist die Verwendung (Hinzufügen / Entfernen von Beobachtern) zum Beispiel in Aktivitäten:

     public class LoginActivity extends AppCompatActivity{ private BroadcastReceiver loginResponseReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // do what you need to do with parameters that you sent with notification //here is example how to get parameter "isSuccess" that is sent with notification Boolean result = Boolean.valueOf(intent.getStringExtra("isSuccess")); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //subscribe to notifications listener in onCreate of activity NotificationCenter.addObserver(this, NotificationType.LoginResponse, loginResponseReceiver); } @Override protected void onDestroy() { // Don't forget to unsubscribe from notifications listener NotificationCenter.removeObserver(this, loginResponseReceiver); super.onDestroy(); } } 

    Und hier ist endlich, wie wir eine Benachrichtigung an NotificationCenter von einem Callback oder Rest Service oder was auch immer:

     public void loginService(final Context context, String username, String password) { //do some async work, or rest call etc. //... //on response, when we want to trigger and send notification that our job is finished HashMap<String,String> params = new HashMap<String, String>(); params.put("isSuccess", String.valueOf(false)); NotificationCenter.postNotification(context, NotificationType.LoginResponse, params); } 

    Das ist es, Jubel!

    Sie könnten schwache Referenzen verwenden.

    Auf diese Weise könntest du die Erinnerung selbst verwalten und Beobachter hinzufügen und entfernen, wie du willst.

    Wenn Sie addObserver hinzufügen, fügen Sie diese Parameter hinzu – werfen Sie diesen Kontext aus der Aktivität, die Sie in die leere Schnittstelle hinzufügen, fügen Sie einen Benachrichtigungsnamen hinzu und rufen Sie die Methode auf, um die Schnittstelle auszuführen.

    Die Methode zum Ausführen von Schnittstelle würde eine Funktion haben, die aufgerufen wird, um die Daten zurückzugeben, die Sie so etwas weitergeben

     public static interface Themethodtorun { void run(String notification_name, Object additional_data); } 

    Erstellen Sie eine Beobachtungsklasse, die eine Referenz mit einer leeren Schnittstelle aufruft. Auch konstruieren Sie Ihre Themethodtorun-Schnittstelle aus dem Kontext, der im addobserver übergeben wird.

    Füge die Beobachtung einer Datenstruktur hinzu.

    Um es zu nennen wäre die gleiche Methode, aber alles, was Sie tun müssen, ist, den spezifischen Benachrichtigungsnamen in der Datenstruktur zu finden, verwenden Sie die Methode "Themethodtorun.run" (notification_name, data).

    Dies sendet einen Rückruf, wo immer Sie einen Beobachter mit einem bestimmten Benachrichtigungsnamen erstellt haben. Vergiss nicht, sie zu entfernen, wenn du fertig bist!

    Dies ist eine gute Referenz für schwache Referenzen.

    http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html

    Ich bin dabei, diesen Code zu github hochzuladen. Halten Sie die Augen offen!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.