在android oreo之后,关于服务使用方面有一些限制。我不明白限制如何影响代码?例如,如果我通过startService函数启动服务,并在startcommand函数中返回Start_STICKY,则kill后服务将重新启动。我在这里看不到有关android 8的任何问题。我可以在后台服务中监听位置更新。这里的限制是什么?返回start_sticky足以重新创建和。再次运行服务?
答案 0 :(得分:0)
最近3天,我一直在研究此主题。最后,我从android开发人员网站上了解了android 8后台服务限制,如果要在后台运行服务,则只有一件事很重要,那么您应该在应用中显示通知在5秒内,否则您将获得非法异常 这是实现
@Override
public void onCreate() {
super.onCreate();
startInForeground();
}
private void startInForeground() {
Intent notificationIntent = new Intent(this, SplashScreenActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"some_channel_id")
.setSmallIcon(R.drawable.ic_motion_new)
.setContentTitle("Sure")
.setContentText("Local call notification")
.setTicker("TICKER")
.setContentIntent(pendingIntent);
Notification notification=builder.build();
NotificationChannel channel = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
channel = new NotificationChannel("local_call_notification", "Local Call", NotificationManager.IMPORTANCE_MIN);
channel.setDescription("Local Call Notification");
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(2, notification);
NotificationManager notificationManager= (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(2);
}
启动服务
Intent startServiceIntent = new Intent(context,xyz.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(startServiceIntent);
} else {
context.startService(startServiceIntent);
}
答案 1 :(得分:0)
根据我的测试,当service在后台运行时,如果手动杀死应用程序,服务会通过设置start_sticky重新启动。但是当服务在后台运行一段时间后,无论是否设置了Start_Sticky参数,系统都会自动杀死该服务。还有一个现象是我在Android 10上运行时,无论我怎么设置参数,服务都不会自动重启。