【发布时间】:2018-12-24 12:50:07
【问题描述】:
我正忙于开发每日报价应用程序。我的 MainActivity 类中有一个 ListView,它显示来自本地 SQLite 数据库的每日报价。这样可行。我需要它来更改每天上午 9:00 显示的报价,并在那时向用户发送推送通知。如果为了将用户带到应用程序而关闭应用程序,我需要通知。 ListView 可以在用户打开应用时更新,他们不会知道其中的区别。
我在使用广播接收器和警报管理器时遇到问题。
我目前将我的 BroadcastReceiver 作为 MainActivity 中的一个内部类。我这样做是为了从 BroadcastReceiver 运行填充 ListView 的方法,该方法位于 MainActivity 中。但是,我的接收器在代码中注册和注销,而不是在清单中。这会导致它在每次创建活动时运行,从而导致每次都填充 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{
【问题讨论】:
-
在单独的类中使用广播接收器并在清单中注册,它应该可以工作
-
谢谢你,bk7。当我这样做时,我无法调用位于主要活动中的我需要运行的方法。这是上面列出的 DailyQuoteDatabaseAccess() 方法。关于如何从单独的广播接收器调用它并让它正常工作的任何建议?
标签: android background alarmmanager android-jobscheduler android-workmanager