回答:
あなたはこれを試すことができます:http : //developer.android.com/reference/java/util/Observer.html
私が見つけた最高の同等物は、Androidサポートパッケージの一部であるLocalBroadcastManagerです。
LocalBroadcastManagerのドキュメントから:
インテントのブロードキャストを登録し、プロセス内のローカルオブジェクトに送信するヘルパー。これには、sendBroadcast(Intent)を使用してグローバルブロードキャストを送信するよりも多くの利点があります。
- ブロードキャストしているデータがアプリを離れることはないので、プライベートデータの漏洩を心配する必要はありません。
- 他のアプリケーションがこれらのブロードキャストを自分のアプリに送信することはできないため、セキュリティホールが悪用されることを心配する必要はありません。
- システムを通じてグローバルブロードキャストを送信するよりも効率的です。
これを使用するIntent
と、はと同等であると言えますNSNotification
。次に例を示します。
というイベントの通知を監視するアクティビティ"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();
}
通知を送信/ブロードキャストする2番目のアクティビティ。
@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
、in によって受信され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!
NSNotificationCenter
、受け入れられる答えになるはずです!
これは@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);
}
}
次に、文字列を使用したコーディングの間違いを防ぐために、いくつかの列挙型も必要になります-(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();
}
}
最後に、コールバックやRESTサービスなどからNotificationCenterに通知をポストする方法を示します。
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);
}
それだけです、乾杯!
Bundle params
代わりにを使用するとHashMap
、さまざまなタイプのパラメータを渡すのに便利です。そこの間に素敵な接続があるIntent
とBundle
:intent.putExtras(params)
これを使用することができます:http : //developer.android.com/reference/android/content/BroadcastReceiver.html、これは同様の動作を提供します。
Context.registerReceiver(BroadcastReceiver、IntentFilter)を使用してプログラムでレシーバーを登録すると、Context.sendBroadcast(Intent)を介して送信されたインテントがキャプチャされます。
ただし、アクティビティ(コンテキスト)が一時停止されている場合、レシーバは通知を受信しないことに注意してください。
Guava libのEventBusの使用は、コンポーネントを明示的に相互に登録することなく、コンポーネント間のパブリッシュサブスクライブスタイルの通信を行うための最も簡単な方法であることがわかりました
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") );
}
build.gradleに依存関係を追加することで、Androidライブラリにこのlibを追加できます。
compile 'com.google.guava:guava:17.0'
Kotlin:Kotlinでの@Shikiのバージョンは、フラグメントに少しリファクタリングされています。
Fragment.kt
class MyFragment : Fragment() {
private var mContext: Context? = null
private val mMessageReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//Do something here after you get the notification
myViewModel.reloadData()
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
mContext = context
}
override fun onStart() {
super.onStart()
registerSomeUpdate()
}
override fun onDestroy() {
LocalBroadcastManager.getInstance(mContext!!).unregisterReceiver(mMessageReceiver)
super.onDestroy()
}
private fun registerSomeUpdate() {
LocalBroadcastManager.getInstance(mContext!!).registerReceiver(mMessageReceiver, IntentFilter(Constant.NOTIFICATION_SOMETHING_HAPPEN))
}
}
どこにでも通知を投稿できます。コンテキストだけが必要です。
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(Constant.NOTIFICATION_SOMETHING_HAPPEN))```
PS:
object Constant {
const val NOTIFICATION_SOMETHING_HAPPEN = "notification_something_happened_locally"
}
activity
(時々null
)またはconext
私が使用したものを使用できます。弱参照を使用できます。
この方法では、メモリを自分で管理し、オブザーバーを自由に追加および削除できます。
addObserverがこれらのパラメーターを追加するとき-追加するアクティビティからそのコンテキストを空のインターフェースにキャストし、通知名を追加し、メソッドを呼び出してインターフェースを実行します。
インターフェースを実行するメソッドには、runと呼ばれる関数があり、渡したデータを次のように返します。
public static interface Themethodtorun {
void run(String notification_name, Object additional_data);
}
空のインターフェイスで参照を呼び出す監視クラスを作成します。また、addobserverに渡されるコンテキストからThemethodtorunインターフェイスを構築します。
観測をデータ構造に追加します。
呼び出す方法は同じですが、データ構造で特定の通知名を見つけるだけで、Themethodtorun.run(notification_name、data)を使用できます。
これにより、特定の通知名でオブザーバーを作成した場所にコールバックが送信されます。あなたが終わったらそれらを削除することを忘れないでください!
これは弱参照の良い参照です。
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html
このコードをgithubにアップロードしているところです。目を開けてください!