Android 7.0 移除了三项隐式广播

    xiaoxiao2021-03-25  49

    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

    转载请注明原文地址: https://ju.6miu.com/read-34276.html

    最新回复(0)