2013-03-18 20 views
0

我有广播接收器,当用户收到短信时会触发。广播接收机内的代码只有在我的活动处于前景或设备处于睡眠模式时才会触发。但是,如果我的活动处于前景状态,则遇到一个小问题。 onResume我把布尔值“isActive”设置为true和onStop我把布尔值“isActive”设置为false。 (通过这种方式来检测活动是否在前台似乎很合乎逻辑)。活动生命周期中的问题(如何检测活动是否在前台)

在下面的代码中,我检查屏幕是否关闭或活动在前台,如果其中一个表达式为真,则执行以下代码。

@Override 
public void onReceive(Context context, Intent intent) { 
if(!pm.isScreenOn() || HandleActivity.isHandleActivityActive) { 

// unnecessary code omitted 

    //start activity 
    intent = new Intent(MainService.this, HandleActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //Clear top is necessary otherwise would be a lot of new activites (depends on received sms)  
    startActivity(intent); 
    } 

}

但我不知道什么是有生命周期的活动发生。当我第一次收到短信,它的工作完美。布尔“isActive”具有以下值:

03-04 07:31:49.989: I/APP(7604): is handle activity active: true 
03-04 07:31:50.169: I/APP(7604): is handle activity active: false 
03-04 07:31:50.979: I/APP(7604): is handle activity active: true 

当我收到短信第二次(活动仍处于前景没有SMS读取或任何东西。)我有这些值:

03-04 07:32:04.828: I/APP(7604): is handle activity active: true 
03-04 07:32:06.849: I/APP(7604): is handle activity active: false 

因为“isActive “现在是错误的,”如果“代码不能执行。 有人可以指向正确的方向,什么可能是错误的或如何检查我的活动是否在前景或某事。因为这个原因,我过去两天感到沮丧。

感谢您的任何帮助。

回答

1

让你HandleActivity为SingleTop,让活动开始每一个消息到达时间, 它会正常工作 看到此链接 http://developer.android.com/guide/topics/manifest/activity-element.html

+0

我不认为更改为singleTop会永远解决它,如果活动不在堆栈顶部,则无论如何都会创建一个新实例,并且在检查静态变量时可能会出现问题。但是,更改为'singleInstance'可能工作:) – aeliusd 2013-03-18 15:41:12

+0

我做了工作,我尝试推送通知.. – Rohit 2013-03-18 15:47:45

+0

是的,我想它会,如果活动是在堆栈的顶部。但是你仍然无法保证获得相同的活动实例,因此我建议要么改为singleInstance,要么摆脱静态变量。 – aeliusd 2013-03-18 15:51:30

0

我从您的代码收集:

if(!pm.isScreenOn() || HandleActivity.isHandleActivityActive) { 

那isHandleActivityActive是一个静态变量吗? 在这种情况下,您可能正在检查以前的活动是否正在运行,而不是您正在运行的实际活动。 尝试将该变量改为私有实例变量,然后查看它是否可行。