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