我迷失在Android中的所有通知和服务工作流程中。我的场景是这样的:
我有一个Android应用程序,通过使用JSON-RPC的Web服务与MySQL数据库进行通信。从服务检索的数据将显示在应用程序中。
数据会随着时间的推移而更新,因此应用程序需要监听此更改,如果发生更改,则显示通知并更新应用程序中显示的数据。
要听取更改,我需要运行“无限”(直到应用程序被销毁或者可能直到应用程序销毁它)线程不时会在Web服务上调用一个方法来返回更改自上次检查。
更新:好的,我一直在尝试使用Service
和IntentService
,但它们不符合我的需求:主线程中执行Service
,所以如果我执行无限循环我的应用程序将冻结,IntentService
拥有它自己的工作线程,但没有与应用程序通信,我需要它,或者至少我需要一种方法来知道应用程序是否在前台(在这种情况下)通知不会弹出,但数据将被传递和更新)或在后台(在这种情况下,通知会弹出,点击它会将用户引导到具有更新数据的应用程序)
答案 0 :(得分:0)
#1 您可以从服务中发送广播消息,并在“活动”中定义广播接收器以接收此广播。
发送广播 - 来自服务
Intent i = new Intent("ALERT_CHANGE");
i.putExtra("DATA","News");
sendBroadcast(i);
接收广播活动
registerReceiver(uiUpdated, new IntentFilter("ALERT_CHANGE"));
private BroadcastReceiver uiUpdated= new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent)
{
String DATA = i.getStringExtra("Data");
txt.settext(DATA);
}
};
答案 1 :(得分:0)
好的,经过大量测试后,感谢此处提供的信息,我终于找到了解决问题的方法,所以我将在这里分享:
在IntentService
我有公共静态 AtomicBoolean
来控制循环结束并能够停止服务。
然后确定Activity
是否在前景中我是否使用此处建议的方法https://stackoverflow.com/a/5504711/3107765
不同之处在于我在那里使用静态修改器,所以我可以从服务中检查它。
如果活动在前台,我发送一个广播,就像Eu在这里建议的那样。博士否则我使用通知,一旦点击将让用户参加活动。