Невозможно отправлять периодические c локальные уведомления с WorkManager после закрытия приложения - PullRequest
1 голос
/ 17 апреля 2020

Я столкнулся с проблемой, которая тратит мое время.
Я создаю приложение с локальной базой данных SQLite. Я хочу, чтобы это приложение отправляло пользователю уведомление с некоторыми данными из базы данных SQLite, например, каждые 15 минут. Я успешно достиг этого КАК ДОЛГО, КАК ПРИЛОЖЕНИЕ ИЛИ НЕ УБИВАЕТСЯ Но когда приложение будет убито, уведомления больше не будут отображаться пользователю. Я тестирую приложение на двух реальных устройствах Samsung и Huawei . Вот код для класса уведомлений, который расширяет Worker: -

public Result doWork() {
    try {

      SqliteAssetHelper dbHelper = new SqliteAssetHelper(MainActivity.mcontext);
        mdatabase = dbHelper.getWritableDatabase();


        Cursor mCursor = mdatabase.query(BDH.BDHEntry.TABLE_NAME,
                new String[]{BDH.BDHEntry.COLUMN_HADITH_ID,BDH.BDHEntry.COLUMN_BOOK_NAME,
                        BDH.BDHEntry.COLUMN_DOOR_NAME, BDH.BDHEntry.COLUMN_NARRATORS, BDH.BDHEntry.COLUMN_CONTEXT},
                BDH.BDHEntry.COLUMN_BOOK_ID+"=?",new String[]{"1"},null,null, "RANDOM() LIMIT 1");

        if (mCursor != null) {
            mCursor.moveToFirst();
            if (mCursor.getCount() > 0) {
                while (mCursor.isAfterLast() == false) { //You need to check if cursor doesnot contain last row
                    hadithID = mCursor.getString(mCursor.getColumnIndex("HadithID"));
                    book = mCursor.getString(mCursor.getColumnIndex("BookName"));
                    door = mCursor.getString(mCursor.getColumnIndex("DoorName"));
                    mCursor.moveToNext();
                }
            }
        }

        Intent intentActivity = new Intent(MainActivity.mcontext, HadithActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intentActivity.putExtra("id", hadithID );
        PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.mcontext, 0, intentActivity, PendingIntent.FLAG_UPDATE_CURRENT);

        notificationManager = NotificationManagerCompat.from(MainActivity.mcontext);
        Notification notification = new NotificationCompat.Builder(MainActivity.mcontext,CHANNEL_ID)
                .setSmallIcon(R.drawable.book)
                .setContentTitle(book)
                .setContentText(door)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setAutoCancel(true)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setContentIntent(contentIntent)
                .build();

        notificationManager.notify(notificationID, notification);
        return Result.success();

    }
    catch (Throwable throwable)
    {
        return Result.retry();
    }
}

В Основном действии я использую предыдущий уведомитель, который появляется каждые 15 минут: -

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mcontext = this;


    //creating constraints
    Constraints constraints = new Constraints.Builder()
            .setTriggerContentMaxDelay(1, TimeUnit.MINUTES)
            .build();


    PeriodicWorkRequest showHadithEveryHour = new PeriodicWorkRequest.Builder(HadithNotifier.class, 15, TimeUnit.MINUTES)
            .setConstraints(constraints)
            .build();
    WorkManager.getInstance(this).enqueue(showHadithEveryHour);
    }


Когда я изменяю код класса уведомителя, чтобы показать сообщение журнала без каких-либо значений, Результат для работника в logcat: Success

Log.d(TAG,"Work Manager is working");

enter image description here Если я изменю код класса уведомителя, чтобы показать сообщение в журнале со значением из курсора или для отображения жесткого закодированное уведомление не работает, и Результат для работника составляет Retry. enter image description here

1 Ответ

1 голос
/ 17 апреля 2020

Как минимум, удалите все ссылки на MainActivity.mcontext из этого класса. Еще лучше было бы полностью удалить mcontext из приложения, так как это утечка памяти.

Ваш Worker конструктор передается Context. Держитесь за него в поле и используйте это Context из вашего doWork() метода.

...