-2

私はかなりここにいるようです!!

この質問はすでにここや他の場所で尋ねられていることを知っており、投稿された回答を実装しようとしましたが、うまくいきません

Activity Aif ステートメントに基づくアクティビティ ( ) があり、 が開始されますActivity B。私の問題はActivity A実行し続けることですActivity A。アラームを鳴らして電話を振動させると、両方が継続し、Activity B起動中と実行中(logcatで確認できます)、そのために前面に出ることはありません。

これが私のifステートメントのコードです

        if (dynamicActivation > threshold) {

                    alarmHandler.post(new Runnable() {
                        public void run() {
                            int duration = Toast.LENGTH_SHORT;
                            CharSequence text = "YOUR CHILD HAS TRAVELLED OUTSIDE PROXIMITY";
                            Context context = getApplicationContext();
                            proximityAlert = Toast.makeText(context, text,
                                    duration);
                            proximityAlert.show();
                            alarmSound.start();
                            //v.vibrate(3000);

                            try {
                                Thread.sleep(5000);
                                openMaps();

                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    });
                }

そして、ここにopenMaps()関数のコードがあります

public void openMaps() {

    Class track = ParentReal.class;
    Intent PRealIntent = new Intent(this, track);

    PRealIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(PRealIntent);

    ANN.this.finish();


}

問題が発生した場合に備えて追加する必要があるのは、ボタンをクリックすると別のアクティビティであるメニューが開くことActivity Aです...開始したら、メニューアクティビティも閉じる必要がありますActivity Aか?

前もって感謝します!

編集

反対票の理由はわかりませんが、問題を説明してみます。3 つのアクティビティ A、B、C があります。A は私のメニューです。ボタンをクリックすると、アクティビティ B で、 if ステートメントの結果 アクティビティ C が開始されます。

問題は C の実行です。プロセスは logcat で確認できますが、開かれません。B は引き続きアラームとバイブレーションを鳴らし続けます。その後、電話機が停止し、アラームとバイブレーションが鳴り続けます。上記の if ステートメントのコードと openMaps() 関数のコードもあります。これは、if の結果に基づいて呼び出され、アクティビティ C を開いて B を閉じようとします。

それがより明確であることを願っています;)

別の編集

わかりました、問題が何であるかはわかりましたが、それを解決する方法がわかりません。私はスレッドを持っています。そのスレッドの中に無限の while ループがあり、この無限の while ループの中で 2 つの座標間の距離をチェックします (常に更新したい)。

問題は、グローバルに宣言した変数がループ内で初期化されるため、その中で if ステートメントを実行してそれらにアクセスする必要があることです...ブール値の「テスト」を使用して、true の場合は if ステートメントを実行してからテストを設定してみましたfalse にしますが、それはうまくいきません。

これが私のコードです

Thread dist = new Thread(new Runnable() {
        public void run() {

            while (true) {

                child = new Location("point A");

                child.setLatitude(Clatitude);
                child.setLongitude(Clongitude);

                parent = new Location("point B");

                parent.setLatitude(Platitude);
                parent.setLongitude(Plongitude);

                distance = child.distanceTo(parent);
                DisRound = 550;
                dynamicActivation = DisRound * weight;                          

                try {
                    Thread.sleep(1000);

                    if (test)
                    {
                        if(dynamicActivation > threshold)
                        {
                            finish();
                            new Timer().schedule(new MapsTimer(), 5000);
                            test = false;                               
                        }   
                        Log.d("ACTIVATION", Boolean.toString(test));
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    });
    dist.start();

ここに MapsTimer タスクがあります

private class MapsTimer extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {

            public void run() {
                int duration = Toast.LENGTH_SHORT;
                CharSequence text = "YOUR CHILD HAS TRAVELLED OUTSIDE PROXIMITY";
                Context context = getApplicationContext();
                proximityAlert = Toast.makeText(context, text, duration);
                proximityAlert.show();
                alarmSound.start();                 

                openMaps();
            }
        });
    }
}

if ステートメント内で終了を呼び出しています。私はこれで10時間過ごしましたが、それは私の頭を溶かしています.それは簡単だと確信していますが、あなたが方法を知っている場合のみ!!

よろしく、ゲイリー

4

2 に答える 2

1

あなたの質問とコードは明確ではありませんが、一般的に、アクティビティ B に切り替えるコードの後に​​、アクティビティ A を終了する finish() を呼び出す必要があります

于 2013-04-23T13:39:51.353 に答える
0

皆さん、ご協力ありがとうございます。自分で整理しました。while ループにブレークを挿入しました。次のように:

Thread dist = new Thread(new Runnable() {
        public void run() {

            while (true) {

                child = new Location("point A");

                child.setLatitude(Clatitude);
                child.setLongitude(Clongitude);

                parent = new Location("point B");

                parent.setLatitude(Platitude);
                parent.setLongitude(Plongitude);

                distance = child.distanceTo(parent);

                // DisRound = Math.round(distance * 100.0) / 100.0;
                DisRound = 550;

                dynamicActivation = DisRound * weight;                          

                try {
                    Thread.sleep(1000);

                        if(dynamicActivation > threshold)
                        {   
                            proximityAlert.show();
                            alarmSound.start(); 
                            new Timer().schedule(new MapsTimer(), 5000);
                            break;                          
                        }   
                        Log.d("ACTIVATION", Boolean.toString(test));

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            finish();
        }
    });
    dist.start();

したがって、アラートが表示され、アラームが再生され、mapsTimer が呼び出されると、無限ループから抜け出し、不要になったので、finish(); を呼び出します。

于 2013-04-23T19:04:09.087 に答える