在模拟器上关闭应用程序时,Android AlarmManager无法运行

时间:2019-01-27 20:39:59

标签: android service alarmmanager

我搜索了这个主题,到处搜索,没有找到答案。

问题:

在模拟器(API 27)和我的注释8中,我都使用android studio运行我的应用程序,在SettingsActivity中,单击“重置”按钮,然后在2分钟后设置了alarmmanager。 2分钟后,会在确切的时间发送通知,然后在服务2分钟后设置Alarmmanager,依此类推……一切正常。

但是,当我关闭我的应用程序时,什么也没做。没有日志记录,没有错误,没有通知,否则。

所有这些实现都是为了模拟。实际上,alarmmanager将设置几天。工作正常后,服务会执行一些工作,然后再设置警报管理器一天。

这是我的配置:

清单:

...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
<service
        android:name=".service.ServiceTest"
        android:enabled="true"
        android:exported="false"
        android:icon="@drawable/ic_launcher"
        android:label="Service Test" />
...

ServiceTest扩展服务:

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {

    NotificationUtil.sendNotification(getApplicationContext());
    Apps.alarmSet(getApplicationContext(), ServiceTest.TAG);

    stopSelf(startId);

    return super.onStartCommand(intent, flags, startId);
}

SettingsActivity-> ResetButton setOnClickListener:

Apps.alarmSet(getApplicationContext(), SettingsActivity.TAG);

应用程序类AlarmSet方法:

public static void alarmSet(Context context, String triggerName) {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    calendar.setTimeInMillis(calendar.getTimeInMillis() + 120000L); // 2 min later
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, ServiceTest.class);
    PendingIntent pendingIntent = PendingIntent.getService(context, ServiceTest.SERVICE_ID, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);

    if (alarmManager != null && pendingIntent != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }

        SmartLogger.appendLog(context, triggerName, "Alarm is setupped : " + DateUtil.millisToFormattedDate(calendar.getTimeInMillis(), "dd.MM.yyyy HH:mm"));
    } else {
        SmartLogger.appendLog(context, triggerName, "AlarmManager or PendingIntent is null");
    }
}

0 个答案:

没有答案