24

为了创建一个接收器,我WakefulBroadcastReceiver在我的旧项目中进行了扩展。但现在是deprecatedWakefulBroadcastReceiver而不是Receiver我现在应该使用的以及如何用新方法转换下面的代码?

这是我的代码:

 public class TaskFinishReceiver extends WakefulBroadcastReceiver {
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mWakeLock;
    @Override
    public void onReceive(Context context, Intent intent) {
        mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        turnOnScreen();
        Intent wakeIntent = new Intent();

        wakeIntent.setClassName("com.packagename", "com.packagename.activity.TaskFinished");
        wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(wakeIntent);
    }


    public void turnOnScreen(){
        mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        mWakeLock.acquire();
    }
}
4

2 回答 2

13

你可以像这样重写你的代码:

    public class TaskFinishReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //do your stuff in the JobIntentService class
            MyJobIntentService.enqueueWork(context, intent);
        }
    }

这将起作用,因为根据文档,新的JobIntentService类将处理唤醒锁和向后兼容性:

使用此类时无需使用 WakefulBroadcastReceiver。在 Android O 上运行时,JobScheduler 将为您处理唤醒锁(从您将工作入队到作业被调度以及在运行期间保持唤醒锁)。在之前版本的平台上运行时,这种唤醒锁处理是通过直接调用PowerManager在类中模拟的;这意味着应用程序必须请求 WAKE_LOCK 权限。

于 2018-06-27T08:07:28.967 回答
7

WakefulBroadcastReceiver 在 API 级别26.1.0中已弃用

从 Android O 开始,背景检查限制使此类不再普遍有用。(从接收到广播开始服务通常是不安全的,因为您无法保证您的应用此时处于前台,因此允许这样做。)相反,开发人员应该android.app.job.JobScheduler使用一个工作,这并不要求应用程序在这样做时保持唤醒锁(系统将负责为工作保持唤醒锁)。

public class JobSchedulerService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {

        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {

        return false;
    }

}

对于演示案例,检查

于 2017-11-10T07:07:58.207 回答