2017-12-05 33 views
1

現在、特定の時刻にコードを実行しようとしています。いくつかの研究の後、私は正しい方法は、AlarmMangerの使用を行うことです。コードは毎日午前3時に実行する必要があります。電話が午前3時に停止している場合、電話をオンにした直後にコードを実行する必要があります。特定の時刻に毎日コードを実行する - AlarmManager

私はグーグルを使用し、多くの結果を見つけました。しかし、私のコードは正しく動作していません。

昨日私は通知を受けました。通知時間は午後10時だった。しかし、コードでは、時間は午前3時に設定されています。私は時間のために(テストのために)多くのアラームマネージャを設定しました。トリガーされたAlarmManagerが古いものだった可能性はありますか?注:新しいAlarmManagerを設定する前に、私は自分の電話機から完全なアプリケーションを削除し、それを新規にインストールしました。 (私はこれは、すべての設定AlarmManagerのを削除すると思う?)

さて、ここで私が使用していたコードです:

Calendar calendar = Calendar.getInstance(); 
 
calendar.setTimeInMillis(System.currentTimeMillis()); 
 
calendar.add(Calendar.SECOND, 0); 
 
calendar.add(Calendar.MINUTE, 0); 
 
calendar.add(Calendar.HOUR, 3); 
 

 
Intent _myIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
 
_myIntent.putExtra("MyMessage","Content of the message"); 
 
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
 

 
AlarmManager alarmManager = (AlarmManager) MainActivity.this.getSystemService(Context.ALARM_SERVICE); 
 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000*60*60*24, pendingIntent);

このコードは(私のアプリの起動のたびに実行されます内部MainActivity'sonCreate();メソッド)。

+0

alaramマネージャを使用する代わりに、日付と時刻が今日の日付と時刻と異なる場合は、sharepreferenceに日付と時刻を格納しようとしましたが、あなたはurコードを実行して古い日付と時刻を保存することができます。 –

+0

@LokeshDesaiしかし、基本的な 'AlarmManager'をどのように動かすことができますか?現在、午後3時に発砲していません。あなたにアイデアを実現するためには、特定の時間に発射する必要があります。これは、共有された選好で与えられます。 – MyNewName

+0

はい、あなたは私の考えで正しいです、それは特定の時間に実行されますが、それはあなたが電話に切り替えたときに、あなたが直接あなたが、私は 'BroadcastReceiver'を実装しているBroadCastReceiver –

答えて

1

注:API 19のように、全繰り返しアラームが不正確です。アプリケーションで正確な配信時間が必要な場合は、毎回正確なアラームを使用して、毎回スケジュールを変更する必要があります。

不正確なスケジューリングは、アラームの2つの連続した起動間の時間が変わる可能性があることを意味します。私はあなたが使用いずれかを使用すべきだと思うあなたのケースで起こって何が正確な時間の問題を克服guess.To厥あなたは次の日のためにそれを再スケジュールする必要があり、この場合にalarm.Butを撃ちました。等々。 あなたはドキュメントsetrepeatingsetInexactRepeatingから非常に明確に理解を得る取得することができます。

+0

アラームは無効です。数分は問題ありませんが、数時間は問題です。だから、私は警報が発砲されるたびに新しい警報を作成します。最初のアプリケーション起動時に最初のアラームが作成されます。 **より多くの質問で**。起動したアラームはどうなりますか?削除されますか?それが解雇されたら削除する必要がありますか? – MyNewName

+0

シングルショットアラームは、一度発射されると自動的に削除されます(1ショットの寿命)。あなたが行う最良の方法をより明確にするために、ドキュメントを読む必要があります。私は私の意見を与えました。 – ADM

+0

さて、私はそれが発射されると、シングルショットアラームをリセットすることで解決しました。あなたは私に多くのおかげで助けてくれた! – MyNewName

0

私はこれが、Power ManagerがApp Activityの問題を引き起こしたためだと思います。

は、APIレベルで追加Power Manager

PARTIAL_WAKE_LOCKを使用してみてください1 int型PARTIAL_WAKE_LOCK ウェイクロックレベル:CPUが動作していることを確認します。画面とキーボードのバックライトが消灯します。

ユーザーが電源ボタンを押した場合、画面はオフになりますが、CPUは、すべての部分的なスリープ解除が解除されるまで、オンになります。

定数値:1(0x00000001の)

それはまだdoesntの仕事は、あなたには、いくつかのログや活動:)

例のより多くのコードスニペット投稿することができれば、これは、単なる仮定である:

//Initialize the Power Manager 
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

//Create a PARTIAL_WAKE_LOCK 
//This will keep the cpu running in the Background, so that the function will be called on the desired Time 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 

//Check if the WackLock is held (may throw erro if you try to acquire twice) 
//TRUE --> Do nothing, all good 
//FALSE --> Acquire the WakeLock 
if(!wl.isHeld()){ 
    wl.acquire(); 
} 

//***** 
//You code for the repeating task goes Here 
//***** 

//If the Repeating task is not active, release the Lock 

//Check if the WackLock is held (may throw error if you try to release a none acquired Lock) 
//TRUE --> Release Lock 
//FALSE --> Do nothing, all good 
if(wl.isHeld()){ 
    wl.release(); 
} 
+0

私の主な問題は、 'AlarmManager'が与えられた時間で焼成されていないということです。私は 'PowerManager'がどのように私を助けてくれるのか考えていない?あなたはもう少し具体的になりますか?もちろん、より多くのコードを表示できますが、必ずしも必要ではありません。これが唯一興味深いコードです。 – MyNewName

1
Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.HOUR_OF_DAY, 13); // For 1 PM or 2 PM 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
PendingIntent pi = PendingIntent.getService(context, 0, 
      new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
           AlarmManager.INTERVAL_DAY, pi); 

AlarmReceiverがブロードキャストレシーバーであり、それはすでにコンテキストを持っているので、あなたが直接呼び出し音mを設定することができますアクティビティを開始せずに放送受信機からサイレントにする。

@Override 
    public void onReceive(Context context, Intent intent) { 
     AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
     am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
} 

これらの権限を追加してくださいしてください:

<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" ></uses-permission> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" ></uses-permission> 
<receiver android:name=".receivers.MyReceiver" />