我有一个推送通知服务器来向我的Android应用程序发送消息,我想知道在看到消息时通知服务器的最佳方式。
目前,我正在尝试在应用程序的主要活动调用其onResume回调后立即将确认消息发送到服务器,但是由于我使用SingleTop main活动,并且我使用onNewIntent方法处理了一些意图,我无法确定onResume是由于Intent还是应用程序进入前台。我已经在我的活动收到启动它的意图时映射了三种情况中的回调流,它们是:
-
活动在前台(堆栈顶部(上运行(1(
运行 -> onPause(( -> onNewIntent(intent( -> onResume((
-
活动在前台暂停(例如((2(
暂停 -> onRestart(( -> onStart(( -> onResume(( ->onPause(( -> onNewIntent(intent(
-
活动在后台暂停(例如,我在另一个活动中((3(
暂停在后台 -> onNewIntent(intent( -> onRestart(( -> onStart(( -> onResume((
如果我在没有收到意图的情况下导航到我的活动:
-
活动暂停,用户导航到该活动 (4(
暂停 -> onRestart(( -> onStart(( -> onResume((
在情况 1、3 和 4 中,用户以他/她实际可以看到消息的屏幕结束,因此我想发送确认消息。
如果有一个回调只是在活动在屏幕上真正可见的情况下调用的,那就完美了,但我找不到它。
有人知道我该如何解决这个问题吗?
我得到了一个解决方案,也许它不是最好的解决方案,但现在正在工作。
我计划目标活动的每个onResume的确认消息,并在调用暂停时取消它(在大多数情况下表明这是由于外部意图,而不是活动处于唤醒状态(。
onResume((
@Override
protected void onResume() {
Log.d("MainActivity", "onResume");
super.onResume();
final SharedPreferences prefs = getSharedPreferences("lastMessageId", Context.MODE_PRIVATE);
final Long messageId = prefs.getLong("lastMessageId", -1L);
Runnable task = new Runnable() {
@Override
public void run() {
if(messageId!=-1L){
Request req = getAgent().notifyMessageSeen(messageId, ((ApplicationILocate)getApplication()).getUser(MainActivity.this), MainActivity.this);
((ApplicationILocate)getApplication()).addRequestToQueue(req);
prefs.edit().putLong("lastMessageId", -1).commit();
}
}
};
future = scheduler.schedule(task, 1, TimeUnit.SECONDS);
resumedTime = new Time();
resumedTime.setToNow();
}
onPause((
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.d("MainActivity", "onPause");
pausedTime = new Time();
pausedTime.setToNow();
Log.d("MainActivity", "elapsed between resume and pause: "+(pausedTime.toMillis(false)-resumedTime.toMillis(false)));
if(pausedTime.toMillis(false)-resumedTime.toMillis(false) < 100){
future.cancel(true);
}
}
因此,消息每次进入屏幕时都会接收确认,并且屏幕未锁定。欢迎任何更好的解决方案。