liuxiaoddd 2014-05-22 09:55 采纳率: 0%
浏览 1108

android开的简单闹钟,模仿教程,出现问题求助

MainActivity.java如下
public class MainActivity extends ActionBarActivity {
private Button bt=null;
private AlarmManager am=null;
Calendar cal=Calendar.getInstance();
final int DIALOD_TIME=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    am=(AlarmManager)getSystemService(ALARM_SERVICE);
    bt=(Button)findViewById(R.id.bt);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DIALOD_TIME);
        }
    });
}

@Override
protected Dialog onCreateDialog(int id) {
    // TODO Auto-generated method stub
    Dialog dialog=null;
    switch(id){
    case DIALOD_TIME:
        dialog=new TimePickerDialog(this,new OnTimeSetListener() {

            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                Calendar c=Calendar.getInstance();
                //设置Calendar对象
                c.setTimeInMillis(System.currentTimeMillis());
                //设置时分秒毫秒
                c.set(Calendar.HOUR_OF_DAY,hourOfDay);
                c.set(Calendar.MINUTE,minute);
                c.set(Calendar.SECOND,0);
                c.set(Calendar.MILLISECOND,0);

                Intent intent=new Intent(MainActivity.this,AlarmReceiver.class);
                PendingIntent pi=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);
                am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);
                Toast.makeText(MainActivity.this,"闹钟设置成功",Toast.LENGTH_SHORT).show();
            }
        } , Calendar.HOUR_OF_DAY, Calendar.MINUTE,true);
        break;
    }
    return dialog;
}

}

主要在这两句,
Intent intent=new Intent(MainActivity.this,AlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);
am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);
不知道为什么有时候闹钟会好,现在彻底不行了。。

AlarmReceiver.java如下
public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent i=new Intent(context,AlarmActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
    MediaPlayer mp = new MediaPlayer();
    try {
        mp.setDataSource(context, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE));
    } catch (IllegalArgumentException | SecurityException
            | IllegalStateException | IOException e) {
        e.printStackTrace();
    }
    try {
        mp.prepare();
    } catch (IllegalStateException | IOException e) {
        e.printStackTrace();
    }
    mp.start();
}   

}
求高手解答,菜鸟一枚。。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 03:22
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的AlarmReceiver类中有一个错误。你尝试在onReceive方法中创建一个Intent并将其作为参数传递给context.startActivity()。但是,你需要先获取当前的应用上下文,然后才能创建和启动这个意图。

    以下是修复后的代码:

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null && intent.getAction().equals("alarm.action")) {
                Intent i = new Intent(context, AlarmActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
            }
        }
    }
    

    这段代码首先检查Intent是否为alarm.action。如果是,它将创建一个新的Intent并将AlarmActivity作为其第一个活动,并且添加了一个FLAG_ACTIVITY_NEW_TASK标志以确保在启动新任务之前执行任何其他操作(例如显示对话框)。最后,它使用context.startActivity(i)启动新的AlarmActivity

    这样做的好处是,即使你在onReceive方法中没有处理特定于AlarmReceiver的事件,也不会导致应用崩溃或引发异常。

    评论

报告相同问题?