1

テストモード用に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);
}
}
4

1 に答える 1

2

オーダード ブロードキャストを使用してNotification. BroadcastReceiverおそらく、アクティビティがフォアグラウンドにあり、このブロードキャストの優先度が高い場合に、アクティビティでリクエストを処理する必要があるため、これを行っています。

そのパターンは、覚醒していない状況では問題ありません。ただし、doWakefulWork()終了すると、デバイスを起動したままにするものは何もないため、デバイスはスリープ状態に戻ります。注文Broadcastは非同期に行われるため、その作業はdoWakefulWork()終了後に行われるため、Notificationまったく行われない場合があります。あなたが説明したように部分的に発生している場合、私は個人的にこの動作を Android のバグと見なします (着信音を再生する目的でNotification独自に保持する必要があります) が、単に制御できない可能性は十分にあります。ブロードキャストが配信される前にデバイスがスリープ状態になるためです。WakeLockBroadcastReceiver

2 秒間ホールドするWakeLock回避策は成功の可能性を高めますが、それも保証されていません。をレイズする機会を確実に得る唯一の保証された方法Notificationは、次のいずれかです。

  1. doWakefulWork()、またはの中でその作業を行います

  2. WakeLock放送が終了してNotificationが上がるまでを押し続けます。

WakefulIntentServiceあなたがやりたいと思われることは合理的であり、パターンの共通の実装があるといいので、シナリオをより適切に処理するために、将来フレームワークに追加機能を追加することを検討します。ただし、あなたがやろうとしていることは、間違いなく現在の範囲外WakefulIntentServiceです。

于 2012-07-14T10:13:18.520 に答える