首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓wakeLock问题

安卓wakeLock问题
EN

Stack Overflow用户
提问于 2020-04-20 13:40:10
回答 1查看 178关注 0票数 3

我有前台服务。

清单包含此权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

在Splash活动中,我请求此权限一次:

代码语言:javascript
复制
Intent intent = new Intent();
        String packageName = context.getPackageName();
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
            intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
        }
        context.startActivity(intent);

在onCreate服务方法中,我调用createAlarm方法:

代码语言:javascript
复制
private void createAlarm() {
    wakeupIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent("com.android.internal.location.ALARM_WAKEUP"), 0);
    powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getPackageName() + ":TrackService");
    wakeLock.acquire();

    dozeHandler = new Handler();
    Runnable heartbeat = new Runnable() {
        @Override
        public void run() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                try {
                    if (powerManager != null && powerManager.isDeviceIdleMode()) {
                        try {
                            Log.d("MainService", "In IDLE MODE");
                            wakeupIntent.send();
                        } catch (SecurityException | PendingIntent.CanceledException e) {
                            Log.d("MainService", "Heartbeat location manager keep-alive failed", e);
                        }
                    } else if (!powerManager.isDeviceIdleMode()) {
                        Log.d("MainService", "Device alive");
                    }
                } finally {
                    if (dozeHandler != null)
                        dozeHandler.postDelayed(this, 5000);
                }
        }
    };
    heartbeat.run();

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, MyWakefulReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    if (Build.VERSION.SDK_INT >= 23) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
    } else {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
    }
}

并且在调用setWakeLock的所有初始化之后:

代码语言:javascript
复制
@SuppressLint("WakelockTimeout")
public void setWakeMode(Context context, int mode) {
    boolean wasHeld = false;
    if (wakeLock != null) {
        if (wakeLock.isHeld()) {
            wasHeld = true;
            wakeLock.release();
        }
        wakeLock = null;
    }
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(mode | PowerManager.ON_AFTER_RELEASE, MainService.class.getName());
    wakeLock.setReferenceCounted(false);
    if (wasHeld) {
        wakeLock.acquire();
    }
}

我对这些功能感到困惑,因此我没有得到唤醒,请帮助我。

EN

回答 1

Stack Overflow用户

发布于 2020-05-01 07:05:54

代码语言:javascript
复制
boolean wasHeld = false;
if (wakeLock != null) {
    if (wakeLock.isHeld()) {
        wasHeld = true;
        wakeLock.release();
    }
    wakeLock = null;
}

仅当'wakeLock.isHeld()‘时,才将'wasHeld’设置为true。仅当'wasHeld‘为true时才调用acquire:

代码语言:javascript
复制
if (wasHeld) {
    wakeLock.acquire();
}

去掉'if (wasHeld)...‘不管怎样,只要调用acquire,我猜wasHeld总是为false,所以acquire永远不会被调用。

如果它仍然不能工作,根据AndroidStudio文档,您可以:

代码语言:javascript
复制
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

并调用

代码语言:javascript
复制
wakeLock.release();

完成后。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61315787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档