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.movetoext() を if ブロックの外に移動しました。以前のように無限に実行されることはなくなりました。ありがとうございました。しかし、バックグラウンドで継続的に実行し、アラームを鳴らす時間になったかどうかを確認する必要があります。これを実現するには、保留中のインテントのコードをどこに配置すればよいですか?

4

0 に答える 0