Я столкнулся с проблемой, которая тратит мое время.
Я создаю приложение с локальной базой данных 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");
Если я изменю код класса уведомителя, чтобы показать сообщение в журнале со значением из курсора или для отображения жесткого закодированное уведомление не работает, и Результат для работника составляет Retry
. 