安卓O背景限制

4

从文档中并不清楚应用程序在接收到意图后是否可以在空闲状态下调用startService()。文档谈到了短信/彩信广播意图,但如果应用程序通过广播接收器接收到任何意图,则不清楚该应用程序是否被放置在白名单中。到目前为止,我还没有找到一种方法来测试将应用程序置于空闲状态。有什么建议吗?


1
现在你不能从广播接收器绑定服务。此外,如果应用程序处于空闲状态,startService现在会抛出IllegalStateException异常。 - greywolf82
我通过按Home按钮并打开其他一些应用程序将应用程序置于空闲状态。大约一分钟后,我的应用程序处于_idle_状态。我确认了这一点,因为应用程序无法在该状态下启动服务。 - Waqas
同样的情况也出现在像白名单一样运行的服务中,这是另一种Intent:https://dev59.com/questions/PaHia4cB1Zd3GeqPWJ75 - Waqas
是的,但行为似乎与“忽略电池优化”有关。如果应用程序在白名单中,则不会应用限制。 - greywolf82
@greywolf82 但我的应用程序已经进行了“电池优化”,但后台服务仍会持续运行很长一段时间。有什么方法可以知道应用程序是否在白名单中? - Waqas
显示剩余11条评论
2个回答

0

自 Android O 开始,只有在以下情况下才能调用 startService():

  1. 您的应用程序在前台。
  2. 您使用 JobScheduler/JobService 来包装调用。

对于第二种情况,您基本上需要替换:

startService(startMyServiceIntent);

使用这个:

ComponentName serviceName          = new ComponentName(context, MyJobService.class);
JobScheduler  jobScheduler          = (JobScheduler)context.getSystemService(Context.JOB_SCHDULER_SERVICE);
JobInfo       startMySerivceJobInfo = new JobInfo.Builder(MyJobService.JOB_ID, serviceName).setMinimumLatency(100).build();
int           result                = jobScheduler.schedule(startMyServiceJobInfo);

然后你只需要一个继承JobService的类来实际启动服务:

public class MyJobService extends JobService {
  public static final int JOB_ID = 0;  // app unique job id. 

  @Override
  public boolean onJobStart(JobParameters params) {
    ...
    startService(startMyServiceIntent);
    ...
    return false;
  }
}

这将在前台或后台启动您的服务。仍然存在后台限制,即后台服务可以运行多长时间。请参阅此内容:https://stackoverflow.com/a/44241192/786462


-1

我回复自己:不,只有一些系统意图会将应用程序放入白名单中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接