0

ユーザーがSMSを受信すると起動するブロードキャストレシーバーがあります。ブロードキャストレシーバー内のコードは、アクティビティがフォアグラウンドにある場合、またはデバイスがスリープモードにある場合にのみ起動する必要があります。しかし、自分のアクティビティがフォアグラウンドにあるかどうかを検出するのに小さな問題があります。onResumeはブール値「isActive」をtrueに設定し、onStopはブール値「isActive」をfalseに設定します。(この方法でアクティビティがフォアグラウンドにあるかどうかを検出することは非常に論理的です)。

次のコードでは、画面がオフになっているか、アクティビティがフォアグラウンドにあるかを確認し、式の1つが真である場合は、次のコードを実行します。

@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);
    }

}

しかし、アクティビティのライフサイクルで何が起こっているのかわかりません。私が初めてSMSを受け取ったとき、それは完全に機能しています。ブール値「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

2回目にSMSを受信したとき(アクティビティはまだフォアグラウンドにあります。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」がfalseになっているため、「if」コードを実行できません。誰かが私を正しい方向に向けることができますか、何が間違っている可能性がありますか、または私の活動が前景か何かにあるかどうかを確認する方法。このため、過去2日間はイライラしています。

助けてくれてありがとう。

4

2 に答える 2

1

HandleActivityをSingleTopにして、メッセージが到着するたびにアクティビティを開始できるようにします。これは正常に機能します。このリンク http://developer.android.com/guide/topics/manifest/activity-element.htmlを参照してください。

于 2013-03-18T15:28:48.763 に答える
0

私はあなたのコードから収集します:

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

isHandleActivityActiveは静的変数ですよね?その場合、実際のアクティビティではなく、前のアクティビティが実行されているかどうかを確認している可能性があります。代わりに、その変数をプライベートインスタンス変数に変更して、機能するかどうかを確認してください。

于 2013-03-18T15:35:37.257 に答える