12

Android 4.4 API ページで、次のように読みました。

アプリの targetSdkVersion を「19」以上に設定すると、set() または setRepeating() を使用して作成したアラームは不正確になります。

[切る]

この不正確なバッチ処理の動作は、更新されたアプリにのみ適用されます。targetSdkVersion を「18」以下に設定した場合、アラームは Android 4.4 での実行時に以前のバージョンと同様に動作し続けます。

私のアプリケーションでは、正確な時間アラームが必要で、targetSdkVersion を「19」に更新しました。次のコードは正しいですか?また、以前のバージョンの電話で targetSdkVersion を「19」に設定した場合、「古い」メソッド AlarmManager.set は引き続き同じように機能しますか?

private void setAlarm (long ms){
    final AlarmManager am = (AlarmManager) mCtx.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, BroadcastReceiverAlarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) {
        am.set(AlarmManager.RTC, ms, pi);
    } else {
        setAlarmFromKitkat(am, ms, pi);
    }
}

@TargetApi(19)
private void setAlarmFromKitkat(AlarmManager am, long ms, PendingIntent pi){
    am.setExact(AlarmManager.RTC, ms, pi);
}
4

2 に答える 2

0

4.1.2 をダウンロードし、ADT から 4.4 をアンインストールしました。「ビルド ターゲット」を 4.1.2 に設定し、アプリをクリーンアップして再ビルドし、apk をモバイルに再インストールしました。

ただし、動作はまだ不正確です。

adb shell dumpsys alarm以下から出力を貼り付けます。

RTC_WAKEUP #0: アラーム{426941b0 タイプ 0 net.coolbie.alarmclock}

   type=0 when=+4m46s480ms repeatInterval=0 count=0

   operation=PendingIntent{42553668: PendingIntentRecord{42a6cc38 net.coolbie.alarmclock broadcastIntent}}

"when" が +4m であることがわかりますが、triggerTime はわずか 8 秒です。

long triggerTime = calendar.getTimeInMillis();
long currentTime = System.currentTimeMillis();
Toast.makeText(mContext, "gap is:"+(triggerTime-currentTime)/1000,Toast.LENGTH_LONG).show(); 
Intent intent = new Intent(mContext.getApplicationContext(), AlarmReceiver.class);  
PendingIntent pendIntent = PendingIntent.getBroadcast(mContext.getApplicationContext(),  
                    0, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendIntent);
于 2014-01-04T09:07:14.723 に答える