2

在我的项目中,我有一个包含提醒的数据库。我想将存储在数据库中的日期和时间与当前日期和时间进行比较并发出警报。我为此使用了广播接收器。我面临的问题是接收器无限运行并且不允许活动出现在屏幕上。另外,我检查了日期和时间是否在 if 条件下匹配,并且仅在匹配时才调用接收器。即使条件为假,它也会进入条件并启动接收器。这是我的代码。任何帮助将不胜感激。谢谢!

从数据库中检索值、比较值和启动接收器的代码:

    public class DisplayReminderList extends Activity {

ListView lv;
Intent intent;
public MediaPlayer mMediaPlayer;
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display_reminder_list);
    lv = (ListView) findViewById(R.id.when_display_listview_today);
    adapter = new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_list_item_1);
    SQLiteDatabase database = new SQLiteHelper(getApplicationContext())
            .getWritableDatabase();
    Cursor c = database.rawQuery("select title from Reminder", null);

    c.moveToFirst();
    while (!c.isAfterLast()) {
        System.out.println("Data : " + c.getString(0));
        adapter.add(c.getString(0));
        c.moveToNext();
    }

    lv.setAdapter(adapter);
    c.close();

    Cursor c1 = database.rawQuery(
            "select title,reminderdate,remindertime from Reminder", null);
    Calendar cal;
    String when_reminder_date, when_reminder_time, d, t, when_reminder_title;
    c1.moveToFirst();
    while (!c1.isAfterLast()) {
        when_reminder_title = c1.getString(0);
        d = c1.getString(1);
        t = c1.getString(2);
        cal = Calendar.getInstance();

        when_reminder_date = String.valueOf(cal.get(Calendar.YEAR)) + "-"
                + String.valueOf(cal.get(Calendar.MONTH)) + "-"
                + String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
        when_reminder_time = String.valueOf(cal.get(Calendar.HOUR_OF_DAY)) + ":"
                + String.valueOf(cal.get(Calendar.MINUTE)) + ":"
                + String.valueOf(cal.get(Calendar.SECOND));

        System.out.println("when_reminder_date =" + when_reminder_date
                + "  db date=" + d + " when_reminder_time="
                + when_reminder_time + " dbtime=" + t);

        if (when_reminder_date == d && t == when_reminder_time) {
            System.out.println("Inside if condition");
            Intent intent = new Intent(this, MyBroadcastReceiver.class);
            intent.putExtra("when_reminder_title", when_reminder_title);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    this.getApplicationContext(), 234324243, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
            c1.moveToNext();
        }
    }

    c1.close();
    database.close();

}

public void playSound(Context context, Uri alert) {
    mMediaPlayer = new MediaPlayer();
    try {
        mMediaPlayer.setDataSource(context, alert);
        final AudioManager audioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        }
    } catch (IOException e) {
        System.out.println("OOPS");
    }
}

public Uri getAlarmUri() {
    Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alert == null) {
        alert = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        if (alert == null) {
            alert = RingtoneManager
                    .getDefaultUri(RingtoneManager.TYPE_RINGTONE);
        }
    }
    return alert;
}

public void addreminder_method(View v) {
    intent = new Intent(this, EnterWhenReminder.class);
    startActivity(intent);
}}

广播接收器代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;

public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    AlarmActivityWhen m = new AlarmActivityWhen();
    String title=intent.getStringExtra("when_reminder_title");
    Intent i = new Intent(context, AlertActivity.class);
    i.putExtra("when_reminder_title", title);
    context.startActivity(i);

    // Vibrate the mobile phone
    Vibrator vibrator = (Vibrator) context
            .getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(2000);
    m.playSound(context, m.getAlarmUri());

}}

广播接收器调用的活动:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
public class AlertActivity extends Activity {
    TextView t;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alert);
    Intent i=getIntent();
    String title=i.getStringExtra("when_reminder_title");
    t=(TextView) findViewById(R.id.title);
    t.setText(title);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_alert, menu);
    return true;
}}

更新:

我将 c1.movetonext() 移到 if 块之外。现在它不再像以前那样无限运行了。谢谢你。但我需要它在后台连续运行并检查是否到了发出警报的时间。我应该将待处理意图的代码放在哪里以便发生这种情况?

4

0 回答 0