Jobintentservice для запуска уведомления каждый X час выше Android Oreo - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу активировать уведомление для своего adhan, поэтому я использовал Alarmmanager и JobIntentService, но я не получаю уведомление.

Здесь получатель.

    <receiver android:name="receiver.BootReceiver"
            android:enabled="true"
            android:exported="true">
        </receiver>
<service
            android:name=".services.JobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="false" />

и далее расширение класса обслуживанияJobIntentService.

    public class JobService extends JobIntentService {

    public static final int JOB_ID = 100;
    public static final int NOTIF_ID = 56;
    long timestamp;
    private NotificationManager mNotificationManager;
//    private final IBinder mBinder = new NotificationService.LocalBinder();

//    MediaPlayer mMediaPlayer = null;

    String MpStop;
    SharedPreferences mPreferences;
    float selectedLat, selectedLng;
    String name, userSect;
    boolean mAzanNotification;

    public static void enqueueWork(Context context, Intent work) {

        enqueueWork(context, JobService.class, JOB_ID, work);
    }
@Override
    protected void onHandleWork(@NonNull Intent intent) {
        mPreferences = Application.getAppContext().getSharedPreferences(Utils.PREF_NAME, Context.MODE_PRIVATE);

        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notifyTasker.run();
    }

В notifyTasker isTimerTask (), где я проверяю, равно ли currentTime моему времени молитвы.Если это правда, тогда я запускаю Уведомление.

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "CH_ID")
                    .setSmallIcon(R.mipmap.icon_beta)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                            R.mipmap.icon_beta))
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(text)
                    .setContentTitle(waktu)
                    .setAutoCancel(true) //                    .setSound(uri)
                    .setContentIntent(contentIntent);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

                notificationBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
                // Creating an Audio Attribute
               /* AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();*/

                // Creating Channel
                NotificationChannel notificationChannel = new NotificationChannel("CH_ID", "Testing_Audio", NotificationManager.IMPORTANCE_HIGH); //                notificationChannel.setSound(uri,audioAttributes);
                mNotificationManager.createNotificationChannel(notificationChannel);
            }
            Notification notification = notificationBuilder.build();
            notification.flags |=
                    Notification.FLAG_ONGOING_EVENT |
                            Notification.FLAG_SHOW_LIGHTS;
            notification.ledOnMS = 300;
            notification.ledOffMS = 3000;

            notification.flags |= Notification.FLAG_AUTO_CANCEL;

И вот мой alarmManager, который я активирую из действия.

 Intent intent = new Intent(getMain(), BootReceiver.class);
        // Create a PendingIntent to be triggered when the alarm goes off
        alarmPendingIntent = PendingIntent.getBroadcast(getMain(), BootReceiver.REQUEST_CODE,
                intent, 0);
        // Setup periodic alarm every 5 seconds
        long firstMillis = System.currentTimeMillis(); // first run of alarm is immediate
        int intervalMillis = 60000; // as of API 19, alarm manager will be forced up to 60000 to save battery
        AlarmManager am = (AlarmManager) getActivity().getSystemService(ALARM_SERVICE);
        // See https://developer.android.com/training/scheduling/alarms.html
        int minutes = 1;
        // by my own convention, minutes <= 0 means notifications are disabled
//        if (minutes > 0) {
            am.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    SystemClock.elapsedRealtime() + minutes * 60 * 1000, minutes * 60 * 1000, alarmPendingIntent);

Я пытался запустить уведомление с указанным выше кодом для Android Oreo, ноэто не работает.Есть ли возможность активировать уведомление в определенное время, используя график работы.Как уведомление будет запущено в определенное время азан.

1 Ответ

0 голосов
/ 04 февраля 2019

Лучше идти с планировщиком заданий вместо диспетчера аварий (см. Эту ссылку - https://developer.android.com/reference/android/app/job/package-summary).

"JobScheduler гарантированно выполнит вашу работу, но, поскольку он работает на системном уровне, он также может использовать несколькофакторы для интеллектуального планирования фоновой работы для выполнения заданий из других приложений. Это означает, что мы можем свести к минимуму такие вещи, как использование радиосвязи, что является явным выигрышем от батареи. А с API 24 JobScheduler даже учитывает нехватку памяти, что является очевидным в целомwin для устройств и их пользователей. "

Пример планирования заданий:

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(new JobInfo.Builder(LOAD_ARTWORK_JOB_ID, new ComponentName(this, DownloadArtworkJobService.class))
    .setBackoffCriteria(intervalsInMilliseconds, JobInfo.BACKOFF_POLICY_LINEAR);
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build());
...