1

我有我的AlarmManager,在任何时间后都会导致我的BroadcastReceiver. 所以当然设备可以处于空闲(睡眠)模式,包括密码锁定。我想知道使用https://developer.android.com/training/scheduling/wakelock.html#javaPowerManager是否是 好的做法和 必要性

“创建和保持唤醒锁会对主机设备的电池寿命产生巨大影响。因此,您应该仅在绝对必要时使用唤醒锁,并尽可能短地保持它们。例如,您永远不需要使用唤醒锁锁定活动。如上所述,如果您想在活动中保持屏幕开启,请使用 FLAG_KEEP_SCREEN_ON。

为了更好地理解:最后它应该是默认 Android 闹钟的副本。

显现:

    <receiver android:name=".AlarmReceiver">
        <intent-filter>
            <category
            android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

    <activity android:name=".RingtoneAlarm">
    </activity>

广播接收器:

public class AlarmReceiver extends BroadcastReceiver {
@Override
    public void onReceive(Context context, Intent intent) {
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyApp::MyWakelockTag");
wakeLock.acquire(10*60*1000L /*10 minutes*/);

intent.setClassName(context, "com.example.myName.myWork.RingtoneAlarm");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}

意图打开的活动:

public class RingtoneAlarm extends AnyOfMyActivitynamesIGuess{
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ringtonealarm);
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
   //(setShowWhenLocked(true);setTurnScreenOn(true); My sidenote: both methods are too new for most required API levels)
   //Remember to implement: PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyApp::MyWakelockTag"); wakeLock.release();
[...]
}
}

这是我可以让设备在手机处于空闲(睡眠)模式并使用密码锁定的确切时间唤醒的唯一方法。如果我将它PowerManager放入 RingtoneAlarm Activity 它不起作用,因为没有创建 Activity,因此getWindow().addFlags(....);没有激活。我找不到让它工作的方法PowerManager(如前所述:文档说这不是好的做法)。更重要的是,它感觉PowerManager只是一种解决方法,因为我只需要在BroadcastReceiverRingtoneAlarm 活动创建之间的那一小段时间里使用它,而且它可能会在未来被弃用,就像FLAG_TURN_SCREEN_ON.

那么在wakeLock.acquire(X)中应该是多少秒;在广播接收器中?3 秒太短而且不起作用,10 分钟可能有点过头了……或者没有 PowerManager 有更好的解决方案吗?

4

1 回答 1

1

根据对后台活动启动文档的限制,在 Android Q (API 29) 和更高版本的设备上运行时,根本不允许从后台启动活动。

该文档中所述:

在几乎所有情况下,后台应用程序都应该创建通知以向用户提供信息,而不是直接启动活动。

在特定情况下,您的应用可能需要紧急引起用户的注意,例如正在进行的警报或来电。为此,您之前可能已将应用程序配置为启动后台活动。

自 API 11 以来,他们默认的闹钟实际上已经完成了这个确切的事情,当时添加了API(这在NotificationCompatsetFullScreenIntent中也可用)。这允许您在通知中添加一个 Intent,如果设备的屏幕关闭,该 Intent 会自动启动一个活动,这是闹钟应用程序的推荐做法。

于 2019-09-02T23:20:04.577 回答