Как вызвать метод из dbhelper в broadcastReceiver - PullRequest
0 голосов
/ 26 мая 2020

Я хочу запустить метод в моем dbhelper сразу после запуска моей службы аварийных сигналов, и если этот код работает успешно, я хочу отобразить уведомление на основе результата выполнения метода. Я хочу, чтобы это работало, даже если мое приложение простаивает или работает в фоновом режиме

это мой радиовещательный приемник

public class ExpiryBroadcast extends BroadcastReceiver {

    //db helper
    private DbHelper dbHelper;

    private final String CHANNEL_ID = "expiring_items";
    private final int NOTIFICATION_ID = 200;
    @Override
    public void onReceive(Context context, Intent intent) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            dbHelper.updateExpiryRow();
                NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
                        .setSmallIcon(R.drawable.ic_item_expiring)
                        .setContentTitle("ProExm Product Expiry")
                        .setContentText("Some products will soon expire, check now...")
                        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

                NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
                notificationManager.notify(NOTIFICATION_ID, builder.build());

        }

    }


}

это мой менеджер сигналов тревоги

 public void startAlertAtParticularTime() {

        // alarm first vibrate at 14 hrs and 40 min and repeat itself at ONE_HOUR interval

        intent = new Intent(this, ExpiryBroadcast.class);
        pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 280192, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 17);
        calendar.set(Calendar.MINUTE, 02);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pendingIntent);

        Toast.makeText(this, "Alarm will vibrate at time specified",
                Toast.LENGTH_SHORT).show();

    }

У меня есть это код в моем классе dbhelper, который я хочу запустить перед уведомлением, даже если мое приложение спит или работает в фоновом режиме

  public void updateExpiryRow(){

        int daysToExpiry = 0;
        String selectQuery = "SELECT * FROM " + Constants.ITEMS_TABLE;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        //looping through all records and add to list
        if(cursor.moveToFirst()){
            do{
                ModelItems modelItems = new ModelItems(
                        ""+cursor.getInt(cursor.getColumnIndex(Constants.C_ID)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_ITEM_NAME)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_ITEM_IMAGE)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_ITEM_PRICE)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_ITEM_MANUFACTURER)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_DESC)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_EXPIRY_DATE)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_MANUFACTURE_DATE)),
                        Integer.parseInt(""+cursor.getInt(cursor.getColumnIndex(Constants.C_DAYS_TO_EXPIRY)))-1,
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_ADDED_TIMESTAMP)),
                        ""+cursor.getString(cursor.getColumnIndex(Constants.C_UPDATED_TIMESTAMP))
                );

                SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
                DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("dd-MM-yyyy");

                try {
                    Date date = formatter.parse(modelItems.getItemExp());
                    LocalDate now = LocalDate.now();
                    String text = now.format(formatter2);
                    Date dateNow = formatter.parse(text);
                    long diffInMillies = Math.abs(date.getTime() - dateNow.getTime());
                    long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
                    daysToExpiry = (int) (long) diff;
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                ContentValues values = new ContentValues();
                // id will be inserted automatically as we set AUTOINCREMENT in query

                //insert data
                String timestamp = ""+System.currentTimeMillis();
                values.put(Constants.C_ID, modelItems.getId());
                values.put(Constants.C_ITEM_NAME, modelItems.getItemName());
                values.put(Constants.C_ITEM_IMAGE, modelItems.getItemImage());
                values.put(Constants.C_ITEM_PRICE, modelItems.getItemPrice());
                values.put(Constants.C_ITEM_MANUFACTURER, modelItems.getItemManufacturer());
                values.put(Constants.C_DESC, modelItems.getItemDesc());
                values.put(Constants.C_EXPIRY_DATE, modelItems.getItemExp());
                values.put(Constants.C_MANUFACTURE_DATE, modelItems.getItemMfd());
                values.put(Constants.C_DAYS_TO_EXPIRY, daysToExpiry);
                values.put(Constants.C_ADDED_TIMESTAMP, modelItems.getAddedTime());
                values.put(Constants.C_UPDATED_TIMESTAMP, timestamp);

                //insert row, it will return record id of saved record
                db.update(Constants.ITEMS_TABLE, values, Constants.C_ID +" = ?", new String[] {modelItems.getId()});
                //add record to list
            }while (cursor.moveToNext());
        }
        //close db connection
        db.close();
    }

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Попробуйте использовать службу переднего плана и запустить ее со своего широковещательного приемника, она будет работать, даже если приложение будет убито, а в своей службе вы можете создать экземпляр DbHelper и выполнить то, что хотите, после завершения задач просто остановите его.

0 голосов
/ 26 мая 2020

Прежде всего вам нужно инициализировать dbHelper

dbHelper = new DbHelper();

Затем просто вызовите свой метод.

И этот широковещательный приемник будет работать, если ваше приложение простаивает или даже закрыто

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...