3

7 日後に繰り返しデータを投稿したい。これには、Alarm Manager の setRepeat メソッドを使用します。電話の再起動時にアラームがクリアされるためです。ブートレシーバーを使用して、アラームを再度設定します。

しかし、電話機が 6 日目に再起動され、アラームが再度設定された場合、アラームは 7 日目に鳴るはずではなく、6 + 7 日目に鳴ります。それに対する解決策はありますか??

下手な英語でごめんなさい。助けてください

4

2 に答える 2

7

アラームを設定するときは、共有設定でトリガー時間を保存します。ブートレシーバーでアラームを再度設定しますが、この場合、トリガー時間は共有設定から取得されます。

于 2012-08-02T07:56:44.927 に答える
1

あなたの AndroidManifest.xml で

<receiver android:name="com.Company.PackageName.BootCompletedReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

com.Company.PackageName.BootCompletedReceiver クラスで

public class BootCompletedReceiver extends BroadcastReceiver 
{
    private Context mContext;
    private G9SharedPreferences oSharedPreferences;
    private AlarmManager amSchedules;

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        this.mContext = context;
        oSharedPreferences = new G9SharedPreferences(this.mContext);
        try 
        {
            vUpdateAlarmManager();  
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally
        {
            oSharedPreferences = null;
            this.mContext = null;
        }
    }

    @SuppressWarnings("deprecation")
    public void vUpdateAlarmManager()
    {
        vCancelAlaramManager();
        Date dCurrentDate = new Date(oSharedPreferences.GetLongPreferences(G9Constant.BACKUP_TIME, 0));     
        if(dCurrentDate.getTime() < new Date().getTime())
        {
            dCurrentDate.setDate(dCurrentDate.getDate() + 1);
        }
        vSetRepeatingAlarm(dCurrentDate);
    }

    public void vCancelAlaramManager()
    {
        Intent oIntent = new Intent(mContext, AlarmReceiver.class);
        PendingIntent oPendingIntent = PendingIntent.getBroadcast(mContext, 0, oIntent, 0);
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(oPendingIntent);
        oPendingIntent.cancel();
    }

    public void vSetRepeatingAlarm(Date dScheduleTime)
    {
        amSchedules = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(mContext, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        amSchedules.setRepeating(AlarmManager.RTC_WAKEUP, dScheduleTime.getTime(), AlarmManager.INTERVAL_DAY , pendingIntent);
    }
}
于 2012-08-02T08:32:54.187 に答える