如何每分钟在Android O中运行后台服务?

时间:2018-09-24 09:22:03

标签: android service background-service android-jobscheduler android-workmanager

我有一个旧的应用程序,其中每分钟使用AlarmManager的{​​{1}}调用服务,但是在最新的 Android O 中,它不允许我以相同的方式运行服务。我无法使用前台服务,因为我不想在服务运行时显示任何通知。

我希望以某种方式来调整我的应用程序体系结构,以便我的代码可以在Android O中以最少的更改运行。

当我在Android中运行应用程序时,它是崩溃:(。请在下面找到崩溃的堆栈跟踪。

setExact

编辑:

我的应用程序中的任务是时间紧迫的,因此我在java.lang.RuntimeException: Unable to create application com.***.***.***ControllerApplication: java.lang.IllegalStateException: Not allowed to start service Intent Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.***.***.qa/com.***.***.services.AlarmService 中使用了setExact,但是当前受支持的API均未在确切的时间调度作业。话虽如此,如果我使用JobScheduler / WorkManager,则我的应用程序将发生故障。

1 个答案:

答案 0 :(得分:-1)

您可以使用警报管理器,该警报管理器每10分钟就会调用一次

        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Random random = new Random();
        int m = random.nextInt(9999 - 1000) + 1000;

        Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
        notificationIntent.setClass(this,AlarmReceiver_.class);
        notificationIntent.addCategory("android.intent.category.DEFAULT");

        PendingIntent broadcast = PendingIntent.getBroadcast(YourClass.this, r5, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + 300000L,
                600000L, broadcast);

ManiFest接收器代码,您将在其中获得接收器响应

<receiver android:name="com.yourpackage.AlarmReceiver_"

        >
        <intent-filter>
            <action android:name="android.media.action.DISPLAY_NOTIFICATION" />
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="android.intent.action.REBOOT" />
            <action android:name="android.intent.action.BOOT_COMPLETED" />

        </intent-filter>
    </receiver>

您将必须创建Receiver,在其中您将以上面指定的AlarmReceiver_.class名称接收数据