Должен ли мой вещательный приемник быть статическим внутренним классом или отдельным классом? - PullRequest
0 голосов
/ 24 декабря 2018

Я занят работой над приложением ежедневных цитат.У меня есть ListView внутри моего класса MainActivity, который отображает одну ежедневную цитату из локальной базы данных SQLite.Это работает.Мне нужно, чтобы он изменил котировку, отображаемую каждый день в 9:00, а также отправил push-уведомление пользователю в это время.Мне нужно уведомление, чтобы идти, если приложение закрыто с целью привлечения пользователя в приложение.ListView можно обновить, когда пользователь откроет приложение, и он не узнает разницу.

У меня проблемы с широковещательным приемником и диспетчером аварийных сигналов.

В настоящее время мой BroadcastReceiver используется каквнутренний класс внутри моей MainActivity.Я сделал это для того, чтобы запустить метод, который заполняет ListView, который находится в MainActivity, из BroadcastReceiver.Однако мой получатель зарегистрирован и незарегистрирован в коде, а не в манифесте.Это приводит к тому, что он запускается каждый раз при создании действия, в результате чего ListView заполняется каждый раз, а также наносит ущерб цели, поскольку мне нужно только изменить его и отправлять уведомление каждое утро в 9:00

IЯ пытался сделать широковещательный приемник статическим, а затем зарегистрировать его в манифесте, но у меня возникли всевозможные проблемы со ссылками на нестатические вещи из статического класса.Я также попытался сделать получатель отдельным классом вне класса MainActivity, но затем я не могу вызвать свой метод, который заполняет ListView внутри MainActivity из класса получателя.Это кажется безвыходным, но я знаю, что это не так.В настоящее время он зарегистрирован в onCreate.Я пробовал OnStart, OnResume и т. Д ... он работает так же.Я просто не знаю, что делать.

У меня там нет кода push-уведомления, но я все еще работаю над ним.

Вот мой код:

MainActivity (соответствующие части):

Метод заполнения ListView:

public void DailyQuoteDatabaseAccess(){

SQLiteOpenHelper sqLiteOpenHelper = new SQLiteAssetHelper(this, 
DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase SqlDb = sqLiteOpenHelper.getReadableDatabase();
String rawQuery = "SELECT * FROM dailyQuoteTable ORDER BY RANDOM() LIMIT 
1";
Cursor cursor = SqlDb.rawQuery(rawQuery, null);
DailyQuoteCursorAdapter DQCursorAdapter = new DailyQuoteCursorAdapter(this, 
cursor);
this.mDailyQuoteListView.setAdapter(DQCursorAdapter);
}

Здесь я динамически регистрирую сигнал тревоги в методе onCreate MainActivity:

mTodaysQuoteReceiverStaticInnerClass = new 
TodaysQuoteReceiverInnerStaticClass();
IntentFilter filter = new 
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_BOOT_COMPLETED);
this.registerReceiver(mTodaysQuoteReceiverStaticInnerClass, filter);

Вот мой класс приемника (который я сделал внутренним классом в MainActivity):

public class TodaysQuoteReceiverInnerStaticClass extends BroadcastReceiver{
@Override
public void onReceive(final Context context, final Intent intent){

PopulateTodaysQuote();

}
}

Вот метод, который устанавливает мою тревогу.Я вызываю этот метод из onCreateMethod в MainActivity:

public void todaysQuoteAlarm(){

    long currentTime = System.currentTimeMillis();
    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.HOUR_OF_DAY, 20);
    calendar.set(Calendar.MINUTE, 9);
    calendar.set(Calendar.SECOND, 0);

    if (currentTime <= calendar.getTimeInMillis()) {

        Intent myIntent = new Intent(this, 
TodaysQuoteReceiverInnerStaticClass.class);
        int ALARM1_ID = 10000;
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 
ALARM1_ID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) 
this.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

    }
    else{

1 Ответ

0 голосов
/ 26 декабря 2018

вы можете использовать широковещательный приемник в отдельном классе и запустить оттуда уведомление уведомление от широковещательного приемника .Я считаю, что вы хотите выполнить метод DailyQuoteDatabaseAccess (), когда пользователь откроет приложение.Я предлагаю вам сохранить отдельную таблицу для сегодняшних котировок и в приемнике вещания обновить сегодняшнюю таблицу котировок (при условии, что вы хотите изменять котировку один раз в день) и извлечь данные из сегодняшней таблицы котировок, чтобы показать данные в виде списка.

...