私のプロジェクトには、リマインダーを含むデータベースがあります。データベースに保存されている日時と現在の日時を比較してアラームを鳴らしたい。これにはブロードキャストレシーバーを使用しました。私が直面している問題は、レシーバーが無限に実行されており、アクティビティが画面に表示されないことです。また、日付と時刻が 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 ブロックの外に移動しました。以前のように無限に実行されることはなくなりました。ありがとうございました。しかし、バックグラウンドで継続的に実行し、アラームを鳴らす時間になったかどうかを確認する必要があります。これを実現するには、保留中のインテントのコードをどこに配置すればよいですか?