在Android O

时间:2018-11-01 09:11:43

标签: android android-notifications background-process scheduler android-8.0-oreo

我不敢相信自己在问这个问题,但是我想在我的Android应用中安排通知的时间(是否重复)。

在Android培训文章之后,我设法使用WakefulBroadcastReceiverService轻松地做到了这一点。但是现在,由于我必须将最新的Android API定位为将来的更新,因此我必须对代码进行一些更改。

我认为WakefulBroadcastReceiver已被弃用,因此我使用的是简单的BroadcastReceiver

当前实施

每当我要安排警报时,都会向Intent发送BroadcastReceiver并使用onReceive方法,而不是以前对startWakefulService(context, service);的调用,我做了context.startService(service);。但是由于后台限制,当我的应用程序在后台运行时,我无法启动服务...

我有一个错误: java.lang.IllegalStateException:不允许启动服务:应用程序在后台

如何有效地更改代码以解决此问题?我调用的服务是将通知发送给用户的服务。

代码

  1. 设置闹钟

    Intent broadcastIntent = new Intent(context, AlarmReceiver.class);
    // put the extras for the notification details
    // ...
    alarmIntent = PendingIntent.getBroadcast(context, idNotif, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
            millis, interval, alarmIntent);
    
  2. Intent类收到了AlarmReceiver

    // onReceive method
    context.startService(service); // The ERROR is raised here when my app is in bg
    

编辑

我不能使用JobScheduler,因为它不能保证我会及时发送通知。

我也无法启动前台服务来发送通知。

1 个答案:

答案 0 :(得分:0)

我找到了一篇有用的文章,您可以通过访问此website

了解更多信息

为了简化:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
        notificationIntent.addCategory("android.intent.category.DEFAULT");

        PendingIntent broadcast = PendingIntent.getBroadcast(this, 100, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 30);
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast);
    }

以上代码将在30秒后安排警报,并将广播notificationIntent