テストモード用にAlarmManagerを1分間設定しました。OnAlarmReceiverにブロードキャストを送信します。OnAlarmReceiver start sendWakefulWork(context、TaskService); そして、doWakefulWork()メソッドのTaskServiceで、通知を起動するsendOrderedBroadcastを実行します。これはうまく機能します^音とバイブレーションによる通知が表示されます。ただし、電話がアクティブモードの場合のみ。電話がスリープモード(画面がオフになっている)の場合、通知中はバイブレーションとフラッシュのみが機能します。スリープモードでは通知音は鳴らず、バイブレーションのみです。音が鳴る場合もありますが、たとえば1時間に1回鳴る場合もありますが、毎分音が鳴るはずです。また、電話をコンピュータに接続すると、スリープモードで毎分音が鳴りますが、電話をコンピュータから抜くと、振動するだけで起動します。画面をオンにすると、すべてが正常になります。通知は音とバイブレーションを再生します。
そのため、コードに問題があるのか、電話に問題があるのかわかりません(HTC Desire Android 2.2)
私はそれを修正するために多くのことを試みました:
- デフォルトおよびカスタムサウンド
- Notification.audioStreamType=AudioManager.STREAM_SYSTEMなど
- フラッシュありとフラッシュなし
- 振動ありと振動なし
何もない。スリープモードでは音だけが消え、バイブレーションは完璧に機能しました。
public class OnBootReceiver extends BroadcastReceiver {
public static void setAlarm(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis()+1000,
1*60*1000,
getPendingIntent(ctxt));
}
public static void cancelAlarm(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.cancel(getPendingIntent(ctxt));
}
private static PendingIntent getPendingIntent(Context ctxt) {
Intent i=new Intent(ctxt, OnAlarmReceiver.class);
return PendingIntent.getBroadcast(ctxt, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
@Override
public void onReceive(Context ctxt, Intent intent) {
setAlarm(ctxt);
}
}
TaskServiceクラスのdoWakefulWorkメソッド:
protected void doWakefulWork(Intent intent) {
Intent mIntent = new Intent(EXERCISE_EVENT);
mIntent.putExtra(StringUtils.PARAM_NEXT_TASK_TIME, nextStringTime);
mIntent.putExtra(StringUtils.PARAM_TASK_NUMBER, taskNumber);
sendOrderedBroadcast(mIntent, null);
}
そしてこれは私のNotificationBrodcastReceiverです:
public class NotificationBrodcastReceiver extends android.content.BroadcastReceiver {
public void onReceive(Context ctx, Intent intent) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(ns);
int icon = R.drawable.notif_icon;
CharSequence tickerText = ctx.getResources().getString(R.string.notification_ticker);
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Intent notificationIntent = new Intent(ctx, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, 0);
notification.setLatestEventInfo(ctx, "contentTitle", "contentText", contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
}