Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android equivalent to NSNotificationCenter

In the process of porting an iPhone application over to android, I am looking for the best way to communicate within the app. Intents seem to be the way to go, is this the best (only) option? NSUserDefaults seems much lighter weight than Intents do in both performance and coding.

I should also add I have an application subclass for state, but I need to make another activity aware of an event.

like image 665
John Avatar asked Oct 16 '10 04:10

John


People also ask

What is NSNotification name?

A structure that defines the name of a notification.

How do I add an observer in Swift?

addObserver(self, — This is for the class where we are going to observer notification. selector: #selector(loginSuccess) — This is the method name, whenever notification will receive this method call. name: NSNotification.Name(“com.


1 Answers

The best equivalent I found is LocalBroadcastManager which is part of the Android Support Package.

From the LocalBroadcastManager documentation:

Helper to register for and send broadcasts of Intents to local objects within your process. This is has a number of advantages over sending global broadcasts with sendBroadcast(Intent):

  • You know that the data you are broadcasting won't leave your app, so don't need to worry about leaking private data.
  • It is not possible for other applications to send these broadcasts to your app, so you don't need to worry about having security holes they can exploit.
  • It is more efficient than sending a global broadcast through the system.

When using this, you can say that an Intent is an equivalent to an NSNotification. Here is an example:

ReceiverActivity.java

An activity that watches for notifications for the event named "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

The second activity that sends/broadcasts notifications.

@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); } 

With the code above, every time the button R.id.button_send is clicked, an Intent is broadcasted and is received by mMessageReceiver in ReceiverActivity.

The debug output should look like this:

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!  
like image 155
Shiki Avatar answered Oct 09 '22 04:10

Shiki