对于多个警报(以前是:多个警报 = 多个启动接收器),是否可以避免"重复代码"?



我有一个非常微妙的问题,在比我更专业的眼中,这个问题可能看起来很奇怪。

我正在实现两个不同的警报,它们在重新启动/关闭后仍然有效,并在启动时显示通知
一个是重复的每日提醒,另一个是每月提醒,每次用户完成给定任务时,应用程序都会重置该提醒
只是提醒他/她在一个月后再做一次。

现在,一切都很好
那么问题出在哪里呢?

什么都没有,但我将BootReceiver、AlarmReceiver和AlarmService加倍
只有Notification生成器是通用的。

那么,我的问题是:我能统一这些元素,而不是为了任何警报而分裂它们吗
因为如果没有,如果将来我需要安排每周报警,我就必须制作另一个启动接收器、报警接收器和报警服务。

对我来说,这似乎不太明智(比如我每周添加一个任务,每年添加一个任务:我必须再添加两个所有接收器和服务!!对我来说这似乎很疯狂)
但也许我错了,事情会变成这样?

在我之前写的一个应用程序中(在意识到它没有通过重新启动之前),它与共享所有类的警报一起工作。

谢谢大家抽出时间。

如果您需要查看我的代码,只需索取即可。但是它有点长。。。

这是我的清单文件,只是为了表明我对的怀疑

<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.scheduler2"
android:versionCode="1"
android:versionName="1.14.02.11 b"
>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18"
/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/Theme.Sample"
>
<!-- The Main Activity -->
<activity
android:name="com.example.android.scheduler2.ACT_Base"
android:label="@string/app_name"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- The Preference Activity -->
<activity android:name="com.example.android.scheduler2.ACT_Prefs" />
<!-- 2 Alarms = 2 Alarm Boot receivers -->
<!-- The One Shot Alarm Boot Receiver -->
<receiver
android:name="com.example.android.scheduler2.RCV_Boot_One"
android:enabled="false"
>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- The Repeating Alarm Boot Receiver -->
<receiver
android:name="com.example.android.scheduler2.RCV_Boot_Rep"
android:enabled="false"
>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- 2 Alarms = 2 Alarm receivers -->
<!-- The One Shot Alarm Receiver -->
<receiver android:name="com.example.android.scheduler2.RCV_Alarm_One" />
<!-- The Repeating Alarm Receiver -->
<receiver android:name="com.example.android.scheduler2.RCV_Alarm_Rep" />
<!-- 2 Alarms = 2 Alarm services -->
<!-- The One Shot Alarm Service -->
<service android:name="com.example.android.scheduler2.SVC_Alarm_One" />
<!-- The Repeating Alarm Service -->
<service android:name="com.example.android.scheduler2.SVC_Alarm_Rep" />
</application>
</manifest>

正如我在注释部分中所建议的,下面这样的内容可能是一个解决方案。

这种方法需要四类:

  1. 一个BootBroadcastReceiver.classextends BroadcastReceiver要监听onBootCompleted广播。一旦引导完成,这个类就会启动AlarmStarterService.class
  2. AlarmStarterService.classextends Service将启动两个报警
  3. AlarmBroadcastReceiver.classextends BroadcastReceiver将接收警报触发的广播,然后启动ShowNotificationService.class并通过Intent将ID传递给它
  4. 最后是ShowNotificationService.class,它也是extends Service并且将显示基于通过Intent传递的ID的通知

BootBroadcastReceiver可能是这样的。

public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, AlarmStarterService.class));
}
}
public class AlarmStarterService extends Service {
public static final int REQUEST_CODE_DAILY = 10000;
public static final int REQUEST_CODE_MONTHLY = 10001;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
createAlarm();
stopSelf();
}  
private void createAlarm() {
PendingIntent pIntentDaily = getPendingIntent(REQUEST_CODE_DAILY);
PendingIntent pIntentMonthly = getPendingIntent(REQUEST_CODE_MONTHLY);
AlarmManager am = (AlarmManager) this
.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, TIME_DESIRED, AlarmManager.INTERVAL_DAY, pIntentDaily);
am.setRepeating(AlarmManager.RTC, TIME_DESIRED, AlarmManager.INTERVAL_DAY * 30, pIntentMonthly );
}
private PendingIntent getPendingIntent(int requestCode) {
Intent i= new Intent(this, AlarmBroadcastReceiver.class);
i.putExtra("_id", requestCode);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                     
return PendingIntent.getBroadcast(this, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
}
}

public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, ShowNotificationService.class)
.putExtra("_id", intent.getIntExtra("_id", -1)));
}
}

public class ShowNotificationService extends Service {
int id;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
id = intent.getIntExtra("_id", -1);
return START_STICKY;
}
@Override
public void onCreate() {
switch(id) {
case AlarmStarterService.REQUEST_CODE_DAILY:
showDailyNotification();
break;
case larmStarterService.REQUEST_CODE_MONTHLY:
showMonthlyNotification();
break;
}
stopSelf();
}  
}

我认为您试图做的事情可以同时使用一个来完成,并通过设置应用程序首选项来处理不同的情况(即使超过两个)。

就像你可以保存上一个月的警报时间和上一个星期的警报时间,并将警报设置为最早启动时间。

相关内容

  • 没有找到相关文章

最新更新