【问题标题】:Android O background limitationsAndroid O 后台限制
【发布时间】:2017-03-23 06:22:50
【问题描述】:

如果应用在收到意图后处于空闲状态,是否可以调用 startService() 从文档中不清楚。文档讨论了短信/彩信广播意图,如果应用通过广播接收器接收到 any 意图,则不清楚该应用是否被置于白名单中。直到现在我还没有找到一种方法来测试它,让应用程序处于空闲状态。有什么建议吗?

【问题讨论】:

  • 如果您需要始终运行服务,请使用应用程序类来启动您的服务。无需担心应用状态和应用的其他状态
  • 什么???应用类?我不明白你的意思。
  • startService 可以根据需要多次调用,但是如果您想调用 100 次,最好使用“绑定服务”模式
  • 您不能从广播接收器绑定服务。此外,如果应用处于空闲状态,startService 现在会抛出 IlllegalStateException。
  • BroadcastReceiver#peekService(Context myContext, Intent service)

标签: android android-8.0-oreo


【解决方案1】:

从 Android O 开始,您只能在以下情况下调用 startService():

  1. 您的应用位于前台。
  2. 您使用 JobScheduler/JobService 来包装调用。

对于#2,您基本上替换:

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

【讨论】:

    【解决方案2】:

    我回复自己:不,只有一些系统意图将应用列入白名单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多