该应用程序非常简单。我有一个包含所有活动等的常规应用程序......
我有一项服务会在应用程序首次启动和/或设备重新启动时启动。
我设置了一个 BroadcastReceiver 来处理通知意图,它也非常基本并且功能完美。
当 android 设备上的显示打开时,通知工作完美。但是当我关闭屏幕时,不再创建通知。
我是通知的新手,所以这可能是我忽略的一些简单的事情,但我似乎找不到它。
在我的服务中,我构建了一个工作线程,其中包含一个 Timer,它每分钟触发一次,并将 TimerTask 作为调度方法的一部分:
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
boolean isStopping = false;
if (intent != null) // if the system has to shut us down, go down gracefully
{
String intentAction = intent.getStringExtra(AppData.BROADCAST_ACTION);
if (intentAction != null && intentAction.equals("android.intent.action.REBOOT"))
{
boolean isRebooting = intent.getBooleanExtra(AppData.SYSTEM_ACTION, false);
if (isRebooting)
{
isStopping = true;
stopSelf();
}
}
}
if (!isStopping && !_workerThread.isRunning())
{
_workerThread.run();
}
return Service.START_STICKY;
}
_timer.schedule(_service.getWorker(), startDelay, executionDelay);
NotificationTask (TimerTask) 最终每分钟都会从 Timer 中触发。然后它会检查一些逻辑以查看是否需要创建任何通知,如果需要,它会创建并发送通知,如下所示:
Notification notification = new NotificationCompat.Builder(_context)
.setContentTitle(getString(R.string.notification))
.setContentText(message)
.setLargeIcon(decodeResource(_context.getResources(), iconId))
.setSmallIcon(R.drawable.logo_mark)
.setTicker(ticker)
.setAutoCancel(true)
.setSound(getRingtone(ringtoneUrl))
.setVibrate(VIBRATION_PATTERN)
.setLights(0xfff89829, 300, 5000)
.setContentIntent(intent)
.build();
_notificationManager.notify(notificationId, notification);
通知因通知类型而异,我不在乎用户是否在我用下一个覆盖之前响应了一个。我的问题是如果屏幕关闭,我不会收到通知。
请帮忙。
更新
我想添加代码以防有人像我一样陷入困境。
让我们从 AndroidManifest 开始。包括 2 个广播接收器和您的服务
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name=".services.NotificationService"/>
<receiver android:name=".receivers.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:name=".receivers.NotificationReceiver" />
当您的设备重新启动时,启动接收器只会安排您的警报。您将其设置为调用您的其他接收器,如下所示:
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, NotificationReceiver.class), 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance(), 60 * 1000, pendingIntent);
主接收器将启动您的服务 - 您的服务应该扩展 IntentService 而不是常规服务。这是主要的接收器:
context.startService(new Intent(context, NotificationService.class));
和服务
public class NotificationService extends IntentService
{
public NotificationService()
{
super("Notification Service");
}
@Override
public void onHandleIntent(Intent intent)
{
// this is where I created my notifications
}
}
最后一个小技巧是在您的应用程序中再次创建您的 AlarmManager。这将替换可能已在 Boot Receiver 中创建的 AlarmManager。注意 PendingIntent.FLAG_CANCEL_CURRENT。这样做是为了当用户启动您的应用程序时,如果您的 AlarmManager 尚未在设备启动时注册,则它会被注册。
AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, NotificationReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, Utils.getNow(), 60 * 1000, pendingIntent);
希望这可以帮助。