2

我几乎完成了我一直在制作的这个游戏。这是一个玩具应用程序,只是用来教我。所以我称之为 toyapp。

我正在尝试使用我学到的关于警报管理器、意图和广播的知识来杀死我的应用程序。我想出了如何让我的警报响起 10 秒,然后将消息打印到小部件。这是基于此处的以下教程。

我的想法是我可以调用它,警告用户我要杀死这个应用程序然后关闭它。但是,似乎根本没有调用 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);

}

现在,将我的接收器代码放入我的活动类中。如下:

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

警报设置正确:am.set(...),它应该只被调用一次。但是您会希望屏幕上显示一条消息:

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

这些过程将引用:remote不确定的上下文,因为我记得 appContext。看来您正试图从后台显示一条消息,而您的 GUI 可能会阻止它。尝试删除(评论)该 maeesage 并让

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

Log.d()代码运行,如果你愿意,就做一个。

于 2012-12-08T04:12:14.083 回答
1

AlarmManager类不是为简单的超时而设计的

从上面链接中的文档...

注意:警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前没有运行。对于正常的计时操作(滴答声、超时等),使用 Handler 更容易、更高效。

请参阅Handler类以更有效地执行您想要的操作。

于 2012-12-08T04:38:15.023 回答