我有一些活动和一个处理GCM传入消息的意图服务。
现在,对于每次推送,我都会发送通知,在用户点击后,他会被重定向到适当的屏幕。
我想改变这种行为,即如果应用程序可见(任何活动在前台),而不是通知,则显示对话框消息(通过适当的操作)。
知道如何实现它吗?
我有2个想法,但没有一个是完美的:
还有其他解决方案吗?
答案 0 :(得分:3)
可能的解决方案(想法1):
要检测您的应用程序是在后台运行还是前台运行,您只需在onPause / onResume中设置一个布尔值:
@Override
protected void onResume() {
super.onResume();
runningOnBackground = false;
}
@Override
protected void onPause() {
super.onPause();
runningOnBackground = true;
}
当您从通知中启动一个新意图时,会调用此方法:(如果您使用的是singleTop),使用布尔值可以确定在onNewIntent方法中要执行的操作。
@Override
protected void onNewIntent (Intent intent){
if(runningOnBackground){
//do this
}
else{
//do that
}
}
希望它有所帮助!
答案 1 :(得分:1)
我没有对它进行测试,但是文档说你可以为每项任务获得number of running activities。
尝试在当前正在运行的任务中找到您的应用程序任务:
ActivityManager acitivityManager = (ActivityManager)
context.getSystemService(Context.ACTIVITY_SERVICE);
// Get the top of running tasks, limit by 100
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100);
for (RunningTaskInfo taskInfo : tasks) {
if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) {
if (taskInfo.numRunning > 0) {
// Show dialog
} else {
// Show notification
}
break;
}
}
Google在getRunningTasks()
上添加了一条说明:
注意:此方法仅用于调试和呈现任务管理用户界面。这绝不应该用于应用程序中的核心逻辑,例如根据此处的信息在不同的行为之间进行决策。不支持此类用途,并且将来可能会破坏。例如,如果多个应用程序可以同时主动运行,那么出于控制流程的目的对数据含义的假设将是不正确的。
因此使用它需要您自担风险。
同时检查GCM广播是否为ordered。如果是这样,你可以&#34;覆盖&#34;您的默认BroadcastReceiver
与每个活动中的其他人一起使用。只需使用IntentFilter
的{{3}}即可。当具有较高优先级的BroadcastReceiver
收到该消息时,它可以priority进一步传播。对于您的应用程序,这意味着当某些Activity
正在运行时,它会注册显示对话框并中止广播的接收器。如果没有活动,则默认接收者会显示通知。