2012-04-06 26 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更新为收到的消息。

相关问题