Android эквивалентно NsnotificeCenter
-
08-10-2019 - |
Вопрос
В процессе портирования приложения iPhone на Android я ищу лучший способ общаться в приложении. Наимение, кажется, способ пойти, это лучший (только) вариант? NsuserDefaults кажется гораздо более легким весом, чем напряжение, как в результате деятельности, так и в кодировке.
Я также должен добавить, что у меня есть подкласс приложений для состояния, но мне нужно сделать еще одну деятельность о событии.
Решение
Вы можете попробовать это: http://developer.android.com/reference/java/util/observer.html.
Другие советы
Лучший эквивалент, который я нашел, это Localroadcastmanager. который является частью Android-пакет поддержки.
От документации LocalBroadCastManager:
Помощник для регистрации и отправки трансляций намерений к местным объектам в вашем процессе. Это имеет ряд преимуществ над отправкой глобальных трансляций с SendBroadcast (намерение):
- Вы знаете, что данные, которые вы вещаете, не оставят ваше приложение, поэтому не нужно беспокоиться о протекании личных данных.
- Другие приложения невозможны отправлять эти широковещания в ваше приложение, поэтому вам не нужно беспокоиться о том, чтобы иметь дыры, которые они могут эксплуатировать.
- Это более эффективно, чем отправка глобальной трансляции через систему.
При использовании этого вы можете сказать, что Intent
эквивалентно NSNotification
. Отказ Вот пример:
Приемная активность.java.
Деятельность, которая смотрит на уведомления для мероприятия по имени "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.
Вторая активность, которая отправляет / вещает уведомления.
@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);
}
С кодом выше, каждый раз кнопка R.id.button_send
нажат, намерение транслируется и получено mMessageReceiver
в ReceiverActivity
.
Вывод отладки должен выглядеть так:
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!
Вот что-то похожее на @Shiki ответ, но от угла IOS разработчиков и уведомлений.
Сначала создайте какой-то служба NotificationCenter:
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);
}
}
Затем вам также понадобится жесткий тип Enum, чтобы быть безопасным ошибками в кодировании с строками - (NotificationType):
public enum NotificationType {
LoginResponse;
// Others
}
Вот использование (добавление / удаление наблюдателей), например, в деятельности:
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();
}
}
И вот наконец, как мы публикуем уведомление о уведомлении о некоторых обслуживании обратного вызова или отдыха или что-то еще:
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);
}
Вот и все, ура!
Вы можете использовать это: http://developer.android.com/reference/android/content/broadcastreceiver.html., что дает подобное поведение.
Вы можете регистрировать ресиверы программно через Context.registeRReceiver (Broadcastreceiver, Intentfilter), и оно будет захватывать напряженность, отправленные через контекст.
Следует отметить, что приемник не получит уведомления, если его деятельность (контекст) была приостановлена.
Я обнаружил, что использование EventBus Guava Lib - самый простой способ для публикации-подписывающей связи между компонентами, не требуя компонентов явным зарегистрируем друг с другом
увидеть их образец на 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") );
}
Вы можете добавить эту lib просто на Android Studio, добавив зависимость от вашего build.gradle:
compile 'com.google.guava:guava:17.0'
Вы можете использовать слабые ссылки.
Таким образом, вы можете управлять памятью самостоятельно и добавлять и удалять наблюдатели, как вы, пожалуйста.
Когда вы ADDOBSERVER добавляют эти параметры - ztift, который контекст из действия вы добавляете его в пустой интерфейс, добавьте имя уведомления и вызовите метод для запуска интерфейса.
Метод для запуска интерфейса будет иметь функцию, которая называется запуском, чтобы вернуть данные, которые вы передаете что-то вроде этого
public static interface Themethodtorun {
void run(String notification_name, Object additional_data);
}
Создайте класс наблюдения, который вызывает ссылку с пустым интерфейсом. Также постройте свой интерфейс IMethodtorun из контекста, передаваемого в Addobserver.
Добавьте наблюдение в структуру данных.
Называть это тот же метод, однако, что вам нужно сделать, это найти конкретное имя уведомления в структуре данных, используйте TheThotOdTorun.run (Notification_Name, Data).
Это отправит обратный вызов туда, где вы когда-либо создали наблюдатель с конкретным названием уведомлений. Не забудьте удалить их, когда вы закончите!
Это хорошая ссылка на слабые ссылки.
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html.
Я нахожусь в процессе загрузки этого кода к GitHub. Держите глаза открытыми!