2

私は、私が作ってきたこのゲームをほぼ完成させました。それはおもちゃのアプリであり、私に教えるだけの役割を果たしています。だから私はそれをtoyappと呼んでいます。

アラームマネージャー、インテント、およびブロードキャストについて学んだことを使用して、アプリケーションを強制終了しようとしています。アラームを 10 秒間鳴らしてからメッセージをウィジェットに出力する方法を見つけました。これは、次のチュートリアルhereに基づいています。

これを呼び出して、このアプリケーションを終了させようとしていることをユーザーに警告してから閉じることができると思っていました。しかし、AlarmReceiver がまったく呼び出されていないように見えますか? 私のゲームはただプレイし続けます。

私が変更したコードは、私のtoyapp用に以下にあります。

public void timingService(Context context, Activity activity){
    // get a Calendar object with current time
     Calendar cal = Calendar.getInstance();

 // add 5 minutes to the calendar object
 cal.add(Calendar.SECOND, 5);

 Intent intent = new Intent(context, AlarmReciever.class);
 intent.putExtra("alarm_message", "Game will exit soon");


 // In reality, you would want to have a static variable for the request code instead of 192837
 PendingIntent sender = PendingIntent.getBroadcast(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

 // Get the AlarmManager service
 AlarmManager am = (AlarmManager) activity.getSystemService(context.ALARM_SERVICE);
 am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

}

次に、Receiver コードをアクティビティ クラスに配置します。これは次のとおりです。

public class AlarmReciever extends BroadcastReceiver{


        @Override
        public void onReceive(Context context, Intent intent) {
            try{
                Bundle bundle = intent.getExtras();
                String message = bundle.getString("alarm_message");
                Toast.makeText(context, message, Toast.LENGTH_LONG).show(); //Give message
                toyappActivity.this.finish(); //Exit the game

            }catch(Exception e){
                Toast.makeText(context, "There was an error somewhere", Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

        }


    }//End of AlarmReciever

このアプローチのインスピレーションとなったのは、ここで読んだ次の記事です。

最終的にやりたいことはシンプルです。アラームの有無にかかわらずゲームをプレイするオプションがあります。動きが検出されたら、加速度計センサーでアラームマネージャーをリセットする予定です。それ以外の場合は、カウントダウンしてからゲームをキャンセルします。

私はインテントを直接理解していないと思いますが、これが私のクラッシュポイントです。これがばかげているように思われる場合は申し訳ありませんが、私は今かなりひどい風邪をひいており、これは私にはうまくいくようです. しかし、コンピューターは決して嘘をつきません。私たちの心だけです。

いつものように、皆さんはコーダーと開発者の最高のグループです。私は皆さんから多くのことを学び、皆さんの助けに感謝しています。ばかげた間違いはすべて私自身のものですが、その専門性についてはご容赦ください。

よろしく、 GeekyOmega

4

2 に答える 2

1

AlarmManagerクラスは、単純なタイムアウト用に設計されていません。

上記のリンクのドキュメントから...

注: Alarm Manager は、アプリケーションが現在実行されていない場合でも、特定の時間にアプリケーション コードを実行する場合を対象としています。通常のタイミング操作 (ティック、タイムアウトなど) では、Handler を使用する方が簡単で効率的です。

必要なことをより効率的に行うには、 Handlerクラスを参照してください。

于 2012-12-08T04:38:15.023 に答える
1

アラームは適切に設定されています: am.set(...)、一度だけ呼び出す必要があります。ただし、画面に次のようなメッセージが表示されると予想されます。

Toast.makeText(context, message, Toast.LENGTH_LONG).show(); //Give message

:remoteプロセスは、appContext を覚えているので、コンテキストがどうなるかわからないことを参照します。バックグラウンドからメッセージを表示しようとしているようで、GUI がそれをブロックしている可能性があります。そのメーセージを削除 (コメント) してみてください。

toyappActivity.this.finish(); //Exit the game

コードを実行しLog.d()ます。必要に応じて a を実行してください。

于 2012-12-08T04:12:14.083 に答える