2012-04-06 47 views
0

我的應用程序有一個聊天屏幕來發送和接收消息。每當接收到消息時,都會發送推送通知並顯示最新收到的消息。這一切工作正常。如何檢查當前可見活動並從任何地方啓動其中一種方法?

但是,當我收到我的推送通知時,我想讓聊天畫面自行更新。我想這需要知道聊天屏幕當前是否可見。我如何從BroadcastReceiveronReceive()方法中做到這一點?

這裏有一個小的僞代碼(在我BroadcastReceiver子類):

public void onReceive(Context context, Intent intent) 
{ 
    if(currentlyVisibleActivity.getClass() == chatScreenActivity.class()) 
    { 
     ((chatScreenActivity)currentlyVisibleActivity).getMessages(); 
    } 

} 

我想知道如何獲得currentlyVisibleActvity,使call getMessages()如果它是一個chatScreenActivity它。

+0

您是否將聊天消息存儲在ContentProvider或類似的地方? – Jens 2012-04-06 19:55:13

+0

當測試出聊天功能時,我每隔15秒就會ping服務器以獲取新消息,然後將它們存儲在本地SQLite數據庫中。這只是爲了測試getMessages()方法,我知道每15秒鐘ping一次服務器並不是一件好事。所以我打算每當我收到推送通知時都調用getMessages()。 – PaulG 2012-04-06 19:58:27

+0

Right-o。所以實現一個合適的ContentProvider(檢出[SQLiteContentProvider](http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/2.3_r1/com/android/apps /tag/provider/SQLiteContentProvider.java/?v=source)來擴展適當的抽象實現)。無論何時你調用#getMessages()或類似的方法,只需觸發[notifyChange()](http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database .ContentObserver%29)方法和任何正確實現的ListView(或類似的)都會更新。 – Jens 2012-04-06 20:02:53

回答

1

我假設您正在計劃以下設置?

C2DM -> YourBroadcastReceiver -> somehow call #getMessages() 

如何具有以下組件:

A BroadcastReceiver <for receiving C2DM push notifications> 
An IntentService <for executing #getMessages()> 
A ContentProvider <for storing the results of #getMessages()> 
An Activity <for displaying the contents of ContentProvider> 
  1. 基本上,C2DM觸發您的接收器調用#startService,觸發 您IntentService
  2. 您的IntentService調用#getMessages()並將消息存儲在您的 ContentProvider中。
  3. 無論何時對ContentProvider中的數據執行更改,您都會觸發 觸發ContentResolver#notifyChange()
  4. 如果您的Activity正在顯示和使用,例如CursorAdapterContentProvider中讀取 ,它會自動刷新。

在這種情況下,發送聊天消息也會在ContentProvider中存儲一行 - 自動將UI更新爲收到的消息。

相關問題