我的广播接收器应该是静态内部类还是单独的类?

时间:2018-12-24 12:50:08

标签: android background alarmmanager android-jobscheduler android-workmanager

我正在忙于每日报价应用程序。我的MainActivity类中有一个ListView,它显示来自本地SQLite数据库的每日报价。这样可行。我需要它来更改每天上午9:00显示的报价,并在该时间向用户发送推送通知。如果为了将用户带到应用程序而关闭了该应用程序,我需要发出通知。当用户打开应用程序时,ListView可以更新,他们不知道有什么区别。

我在广播接收器和警报管理器方面遇到问题。

我目前将自己的BroadcastReceiver作为MainActivity内部的一个内部类。我这样做是为了运行从BroadcastReceiver填充MainActivity中的ListView的方法。但是,我在代码中而不是清单中注册和注销了我的接收者。这会导致它在每次创建活动时都运行,从而导致ListView每次都填充,并且无法达到目的,因为我只需要更改它,并在每天的上午9:00发送通知。

我曾尝试将广播接收器设为静态,然后将其注册在清单中,但是我遇到了各种各样的问题,它们引用了静态类中的非静态内容。我也尝试过使接收者成为MainActivity类之外的一个单独的类,但后来我无法从接收者类中调用在MainActivity中填充ListView的方法。似乎是双赢,但我知道事实并非如此。当前已在onCreate中注册。我尝试过onStart,onResume等...它的工作方式相同。我只是不知道该怎么办。

我没有推送通知代码,但我仍在处理它。

这是我的代码:

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);
}

在这里,我在MainActivity的onCreate方法中动态注册警报:

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();

}
}

这是设置我的闹钟的方法。我从MainActivity中的onCreateMethod调用此方法:

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 :(得分:1)

您可以在单独的类中使用广播接收器,然后从notification from broadcast receiver开始通知。我相信您想在用户打开应用程序时执行DailyQuoteDatabaseAccess()方法。我建议您为今天的报价维护一个单独的表,并在广播接收机中更新今天的报价表(假设您想每天更改一次报价),然后从“今日的报价表”中获取数据以在列表视图中显示数据。