在我的应用中,我有一个通知按钮,可以使用IntentService在后台触发短网络请求。在这里显示GUI是没有意义的,这就是我使用服务而不是Activity的原因。请参阅下面的代码。
// Build the Intent used to start the NotifActionService
Intent buttonActionIntent = new Intent(this, NotifActionService.class);
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM);
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId);
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId);
// Build the PendingIntent used to trigger the action
PendingIntent pendingIntentConfirm = PendingIntent.getService(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
这可靠地运行但是由于Android 8.0中的新背景限制使我想要转移到JobIntentService。更新服务代码本身似乎非常简单,但我不知道如何通过PendingIntent启动它,这是通知操作所需要的。
我怎么能做到这一点?
更好地转移到普通服务并在API级别26+上使用PendingIntent.getForegroundService(...)以及API级别25及以下的当前代码?这将需要我手动处理唤醒锁,线程并导致Android 8.0 +上的丑陋通知。
编辑:除了将IntentService直接转换为JobIntentService之外,下面是我最终得到的代码。
BroadcastReceiver,它只是将intent类更改为我的JobIntentService并运行其enqueueWork方法:
public class NotifiActionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, NotifActionService.class);
NotifActionService.enqueueWork(context, intent);
}
}
原始代码的修改版本:
// Build the Intent used to start the NotifActionReceiver
Intent buttonActionIntent = new Intent(this, NotifActionReceiver.class);
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM);
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId);
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId);
// Build the PendingIntent used to trigger the action
PendingIntent pendingIntentConfirm = PendingIntent.getBroadcast(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
答案 0 :(得分:19)
我怎么能做到这一点?
使用BroadcastReceiver
和getBroadcast()
PendingIntent
,然后让接收方通过其JobIntentService
方法调用enqueueWork()
onReceive()
方法。我承认我没有尝试过这个,但AFAIK应该有效。