我有一个Plugin.java
类,其中我定义了两种方法,一种用于使用JobsCheduler(如果API> = 21(,其他用于使用AlarmManager(如果API&lt; 21(。<<<<<<<<<<<<<<<<<<<</p>
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
scheduleDeleteJobScheduler(...);
} else {
scheduleDeleteAlarmManager(...);
}
}
scheduledeletejobscheduler((方法使用工作服务来删除我在数据库中拥有的一些旧条目。
public class ScheduleDeleteService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
deleteOldEntries();
jobFinished(params, false);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
public void deleteOldEntries(){...}
}
senduledeleteletealarmmanager((方法使用broadcastreceiver与工作服务相同。
public class ScheduleDeleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
deleteOldEntries();
}
public void deleteOldEntries(){...}
}
两个类都调用deleteoldentries((方法从数据库中删除旧条目。此方法对于(就业服务和广播员(都是平等的。我想做的是避免使用平等实现的两种方法。
- 因为我已经扩展了工作服务和广播媒介,因为我无法使用摘要或超级类。我知道Java不允许我扩展多个类,因为它将导致编译器无法决定使用哪种超类方法的"钻石问题"。
- 通过使用接口,我只能在没有实现的情况下声明该方法(方法签名(。
- 我知道我可以使用静态和默认方法(使用接口(,但是它们是在Java 8中引入的(Android Nougat -API 24(。因此,如果我使用了它们,则使用JobsCheduler(API> = 21(和AlarmManager(API&LT; 21(的整个逻辑将没有任何意义。
我可以让另一个类实施该方法,只需从计划登机服务(工作服务(和ScheduleDeleDeleCeiver(BroadcastreCeiver(类中调用它,但我希望一些建议可以帮助我更好地实施。
还有一个选项:您可以使用接口遵循该想法,然后将实现放入匿名类中。因此,您同时需要一个单独的接口和实现类,但只需要一个额外的文件。当然,如果可能的话,使用默认方法/多重继承的解决方案看起来更优雅。
oldentriesCleaner.java
interface OldEntriesCleaner {
void deleteOldEntries();
}
主要活动
@Override
public void onCreate() {
super.onCreate();
OldEntriesCleaner cleaner = new OldEntriesCleaner() {
@Override
public void deleteOldEntries() {
// Do the work here
}
};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
scheduleDeleteJobScheduler(..., cleaner)
} else {
scheduleDeleteAlarmManager(..., cleaner)
}
}
服务
public class ScheduleDeleteReceiver extends BroadcastReceiver {
private OldEntriesCleaner cleaner;
public ScheduleDeleteReceiver(OldEntriesCleaner cleaner) {
this.cleaner = cleaner;
}
@Override
public void onReceive(Context context, Intent intent) {
cleaner.deleteOldEntries();
}
}
我们可以在抽象方法和类中找到:
如果这些语句适用于您的情况,请考虑使用抽象类:
- 您想在几个密切相关的类中共享代码。
- ...
首先,我实现了ScheduleDelete摘要类:
abstract class ScheduleDelete {
public void deleteOldEntries(){ ... }
}
之后,在ScheduleDeletService类中,我致电ScheduleDelete#deleteoldentries((方法:
public class ScheduleDeleteService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
(new ScheduleDelete(){}).deleteOldEntries();
jobFinished(params, false);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
和在ScheduleDeledeceiver类中I列出了ScheduleDelete#deleteoldentries((方法:
public class ScheduleDeleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
(new ScheduleDelete(){}).deleteOldEntries();
}
}