【问题标题】:Should my broadcast receiver be a static inner class or a separate class?我的广播接收器应该是静态内部类还是单独的类?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 再次感谢。我会尝试这样做,我会告诉你会发生什么。
猜你喜欢
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2013-10-15
  • 1970-01-01
相关资源
最近更新 更多