-5

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

我正在实现 2 个不同的警报,它们可以在重启/关闭后继续存在,并在触发时显示通知。
一种是重复的每日提醒,另一种是每月提醒,每次用户完成给定任务时由应用程序重置。
只是为了提醒他/她在一个月过去时再做一次。

现在,一切正常。
所以有什么问题?

什么都没有,但我将 BootReceiver、AlarmReceiver 和 AlarmService加倍
了只有 Notification builder 是共同的。

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

对我来说,这似乎不太聪明(假设我添加了每周每年的任务:我必须再添加 2 个所有接收器和服务!!这对我来说似乎很疯狂)。
但也许我错了,事情就是这样?

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

谢谢你们,伙计们,你们的时间。

如果您需要查看我的代码,请索取。不过有点长...

这是我的清单文件,只是为了说明我的疑问:

<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>
4

2 回答 2

4

正如我在评论部分已经建议的那样,以下内容可能是一个解决方案。

这种方法需要四个类:

  1. 一个监听BootBroadcastReceiver.classonBootCompleted广播。启动完成后,该类将启动.extends BroadcastReceiverAlarmStarterService.class
  2. 然后AlarmStarterService.classextends Service启动两个警报。
  3. AlarmBroadcastReceiver.classwhich 也将接收警报触发的extends BroadcastReceiver广播,然后启动ShowNotificationService.class并通过Intent.
  4. 最后ShowNotificationService.classwhich 也extends Service将根据通过Intent.

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();
    }  
}
于 2014-02-18T15:18:23.483 回答
1

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

就像您可以保存最后一个每月的闹钟时间和最后一个每周的闹钟时间,并将闹钟设置为最早的时间。

于 2014-02-18T13:03:48.323 回答