Android 7.0 移除了三项隐式广播

1、CONNECTIVITY_ACTION 广播。在前台运行的应用如果使用 Context.registerReceiver()注册BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE

使用JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件,例如:

public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo job = new JobInfo.Builder(
    MY_BACKGROUND_JOB,
    new ComponentName(context, MyJobService.class))
      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
      .setRequiresCharging(true)
      .build();
  js.schedule(job);
}
满足条件时,启动JobService.onStartJob() ;

使用GMSCore服务时, Android 5.0 (API level 21)以下用户, 使用GcmNetworkManager指定类型Task.NETWORK_STATE_UNMETERE

ConnectivityManager API提供了更加健全的方法,当指定的网络条件满足时,会发生一个回调。

NetworkRequest对象依据NetworkCapabilities定义回调参数。你可以使用NetworkRequest.Builder类创建NetworkRequest对象。使用registerNetworkCallback()把NetworkRequest对象传递给系统。当网络条件满足时,app会接收一个回调 执ConnectivityManager.NetworkCallback 中的onAvailable()方法。

app会持续接受回调,直到app退出或者调用 unregisterNetworkCallback().方法。


2、 ACTION_NEW_PICTURE广播

3、 ACTION_NEW_VIDEO 广播

Android 7.0中扩展了JobInfo和JobParameters.

JobInfo.TriggerContentUri()

JobInfo.Builder.addTriggerContentUri()

public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo.Builder builder = new JobInfo.Builder(
          MY_BACKGROUND_JOB,
          new ComponentName(context, MediaContentJob.class));
  builder.addTriggerContentUri(
          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
  js.schedule(builder.build());
}
当条件发生时,   MediaContentJob.onStartJob();When the system reports a change in the specified content URI(s), your app receives a callback and a JobParameters object is passed to theonStartJob() method in MediaContentJob

The following sample code overrides the JobService.onStartJob() method and records the content authorities and URIs that have triggered the job:

@Override
public boolean onStartJob(JobParameters params) {
  StringBuilder sb = new StringBuilder();
  sb.append("Media content has changed:\n");
  if (params.getTriggeredContentAuthorities() != null) {
      sb.append("Authorities: ");
      boolean first = true;
      for (String auth :
          params.getTriggeredContentAuthorities()) {
          if (first) {
              first = false;
          } else {
             sb.append(", ");
          }
           sb.append(auth);
      }
      if (params.getTriggeredContentUris() != null) {
          for (Uri uri : params.getTriggeredContentUris()) {
              sb.append("\n");
              sb.append(uri);
          }
      }
  } else {
      sb.append("(No content)");
  }
  Log.i(TAG, sb.toString());
  return true;
}


优化你的app在低内存设备或者低内存条件下运行,可以改善性能和用户体验。删除掉后台的service以及静态隐性注册广播接收者能够使你的app在这些设备上更好的运行。Android 7.0 (API level 24) 正在逐渐减少这些问题。推荐优化你的app完全不要使用这些后台进程。

Android 7.0 (API level 24) 有一些额外的 Android Debug Bridge (ADB) 命令,你可以使用这些命令在不使用后台进程情况下测试app的行为。 
模拟隐性的广播和后台服务不可用,使用下面的命令:

$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
 
 
  • 1
  • 1

为了使隐性的广播和后台服务再次可用,使用下面的命令:

$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值