【发布时间】:2020-11-06 08:34:02
【问题描述】:
自从android 10启动以来,我的应用程序中的警报出现问题,我有以下sn-p,我用AlarmManager测试以查看我编写的警报是否被执行。
当我使用setAlarmClock时,闹钟在设定的时间运行,但是当我尝试使用setInexactRepeating(或setRepeating)时,android忽略了闹钟,它根本不运行。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val timeToTrigger = System.currentTimeMillis() + 10 * 1000
val intervalo: Long = 60 * 1000
val intent = Intent(this, AlarmReceiver::class.java)
val pending = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT)
//am.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger , null), pending)
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + intervalo,intervalo,pending)
}
}
这是我的Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lb.alarm_clock_sample">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
android:maxSdkVersion="19" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="22" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AlarmsListActivity" />
<receiver android:name=".AlarmReceiver" />
</application>
</manifest>
提前致谢
编辑
根据@Crispert 的说法,使用android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 可以帮助警报不被忽略。
在清单中添加以下权限:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
然后在活动中,创建一个函数让用户选择是否希望应用程序在后台工作:
@RequiresApi(Build.VERSION_CODES.M)
private fun ignoreBatteryOptimization() {
val intent = Intent()
val packN = packageName
val pm = getSystemService(Context.POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(packN)) {
intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent.data = Uri.parse("package:$packN")
startActivity(intent)
}
}
如果用户同意忽略电池优化,则在后台执行,警报工作没有任何问题(根据我一直在做的测试,到目前为止我没有问题)。 谢谢。
【问题讨论】:
标签: android alarmmanager android-10.0