Androidに目覚まし時計を設置する比較的完備したソリューションについて
7561 ワード
先日、私の「非有名プログラマー」の微信公衆号の楽屋で目覚まし時計を設置したdemoがあるかどうかを聞いた人がいました.確かに目覚まし時計をセットするのは面倒なものです.私がここに書いたこのdemoはクラスライブラリをカプセル化し、目覚まし時計の設定と目覚まし時計のキャンセル方法を直接呼び出せばいいです.毎日の目覚まし時計をセットしたり、月曜日から日曜日の間に選んだ目覚まし時計をセットしたり、使い捨ての目覚まし時計をセットしたりすることができますが、システムと目覚まし時計をセットする方法はほとんど違いませんよね.
効果図
分析と説明を見る前に、まず効果を見てみましょう.効果図は以下の通りです.
アラーム画面の設定
AlarmManager
AlarmManagerの方法については逐一紹介しませんが、全部紹介したら暗くなると思います.AlarmManagerというクラスは、システムアラームサービスへのアクセスインタフェースを提供します.API 19以前、AlarmManagerの一般的な方法は、*set(int type,long startTime,PendingIntent pi);この方法は使い捨て目覚まし時計を設定するために使用され、第1のパラメータは目覚まし時計のタイプを表し、第2のパラメータは目覚まし時計の実行時間を表し、第3のパラメータは目覚まし時計の応答動作を表す.*setRepeating(int type,long startTime,long intervalTime,PendingIntent pi); この方法は、目覚まし時計の繰り返しを設定するために使用され、1番目のパラメータは目覚まし時計のタイプを表し、2番目のパラメータは目覚まし時計の最初の実行時間を表し、3番目のパラメータは目覚まし時計の2回の実行の間隔時間を表し、3番目のパラメータは目覚まし時計の応答動作を表す.*setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); この方法は、2番目の方法と同様に、繰り返し目覚まし時計を設定するためにも用いられるが、2つの目覚まし時計の実行間隔は固定されていない.
API 19から、AlarmManagerのメカニズムはすべて非正確に伝達され、オペレーティングシステムは目覚まし時計を変換し、目覚まし時計とバッテリーの使用を最小化する.targetSdkValersonは、API 19の前に適用されても従来の動作を継続し、すべての目覚まし時計は正確な伝達が要求される場合に正確に伝達される.
API 19以降は、*setWindow(int,long,long,PendingIntent)*setExact(int,long,PendingIntent)という2つの方法が採用されている.上記の2つの方法から分かるように、repeatがないと、目覚まし時計を1回しか鳴らさないように設定されており、どちらの方法も正確に設定されており、1つ目は第2の方法に比べて省電力であるべきである.setWindowという方法は、アプリケーションがバッテリを利用して納品バッチからの処理を最適化することを可能にするため、適切なタイムリーな要求アラートであっても.
主な問題 API 19以降は繰り返し設定されていませんが、目覚まし時計を設置して毎日正確に注意するとしたら? 携帯電話を再起動した後、設定した目覚まし時計はまだ有効ですか? アプリケーションが殺された後、目覚まし時計はまだ有効ですか?
正直に言うと、これらの問題はきっとみんな出会ったことがあると信じています.そして、解決するのはかなり骨が折れています.確かにそうです.私たちがどのように一つ一つ解決するかを見てみましょう.
遭遇した穴を解決する
API 19以降の繰り返し目覚まし時計の設定方法
AlarmManagerを使用してアラートを設定した後、ブロードキャストで受信したことを知っています.設定されたアラート時間が来ると、システムはカスタムブロードキャストを送信し、受信し、アプリケーションのアラートを送信します.では、注意するとき、もう一度設定し直してもいいですか.これでAPI 19が繰り返し目覚まし時計を設定する問題が解決しました.
システムバージョンを判断することにより、目覚まし時計をセットアップする方法が異なり、セットアップが行われます.次に、放送受信システムからの通知を受信し、目覚まし時計の注意を行います.
以上の放送では、API 19の後にアラームが繰り返されているか、0ではないかをその時間間隔がゼロであるかによって判断し、再設定されていることがわかります.setAlarmTime()という方法を見てみましょう.次のようになります.
こうして、繰り返される問題は解決した.
携帯電話の再起動後、目覚まし時計の故障はどのように解決します
はい、携帯電話が再起動した後、目覚まし時計は確かに失効しました.この問題を解決するには、携帯電話の再起動を監視する放送をもう一つ設定し、携帯電話が再起動したときに、もう一度設定し直して、上記の問題を解決することができます.
携帯電話の再起動放送で、私がパッケージした目覚まし時計を再設定する方法を呼び出したのを見てみましょう.これにより、携帯電話の再起動後、目覚まし時計が無効になるという問題が解決しました.注意:放送はリストファイルに登録する必要があります.皆さん、忘れないでください.私はここでコードを貼らない.
アプリケーションが殺され、目覚まし時計が無効になりました
これは本当に良い解決策がありません.プログラムにサービスが書かれている場合は、サービスが再起動されたときに、目覚まし時計を再登録したり、アプリケーションを開いたときに再登録したりすることができます.どうせ目覚まし時計の登録に有利な場所で、再設定を行うことができます.目覚まし時計設定のidが同じであれば、後で設定した目覚まし時計は自動的に前に設定した目覚まし時計を上書きします.アプリが殺された後、目覚まし時計が無効になった問題を解決するのに良い人がいたら、共有してください.
このパッケージのクラスライブラリのメリット
メリットは、私が方法をパッケージ化して、直接呼び出すことができます.*直接時分割の値を入力すればいいです.例えば、ある时点に直接伝えます:12:30、それから毎日注意するかどうか、それとも周何注意するかなど*目覚まし时计の注意のインターフェース私もすでに中に封入して、まだきれいで、怠け者の学生はもう书く必要はありません.満足していない学生は直接クラスライブラリをダウンロードして修正することができます.*目覚まし時計をキャンセルする方法は、私もすでにパッケージしています.
要するに、とても便利で、いったいどれだけ便利なのか、みんなが直接demoを見て知っていて、満足していない学生は直接クラスライブラリをダウンロードして修正することができます.
demoとクラスライブラリアドレス:https://github.com/loonggg/Android-AlarmManagerClock
WeChatの公式アカウント:有名なプログラマーではない(smart_android)に注目して、毎日毎週オリジナル技術の文章を定期的にプッシュします.
効果図
分析と説明を見る前に、まず効果を見てみましょう.効果図は以下の通りです.
アラーム画面の設定
AlarmManager
AlarmManagerの方法については逐一紹介しませんが、全部紹介したら暗くなると思います.AlarmManagerというクラスは、システムアラームサービスへのアクセスインタフェースを提供します.API 19以前、AlarmManagerの一般的な方法は、*set(int type,long startTime,PendingIntent pi);この方法は使い捨て目覚まし時計を設定するために使用され、第1のパラメータは目覚まし時計のタイプを表し、第2のパラメータは目覚まし時計の実行時間を表し、第3のパラメータは目覚まし時計の応答動作を表す.*setRepeating(int type,long startTime,long intervalTime,PendingIntent pi); この方法は、目覚まし時計の繰り返しを設定するために使用され、1番目のパラメータは目覚まし時計のタイプを表し、2番目のパラメータは目覚まし時計の最初の実行時間を表し、3番目のパラメータは目覚まし時計の2回の実行の間隔時間を表し、3番目のパラメータは目覚まし時計の応答動作を表す.*setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); この方法は、2番目の方法と同様に、繰り返し目覚まし時計を設定するためにも用いられるが、2つの目覚まし時計の実行間隔は固定されていない.
API 19から、AlarmManagerのメカニズムはすべて非正確に伝達され、オペレーティングシステムは目覚まし時計を変換し、目覚まし時計とバッテリーの使用を最小化する.targetSdkValersonは、API 19の前に適用されても従来の動作を継続し、すべての目覚まし時計は正確な伝達が要求される場合に正確に伝達される.
API 19以降は、*setWindow(int,long,long,PendingIntent)*setExact(int,long,PendingIntent)という2つの方法が採用されている.上記の2つの方法から分かるように、repeatがないと、目覚まし時計を1回しか鳴らさないように設定されており、どちらの方法も正確に設定されており、1つ目は第2の方法に比べて省電力であるべきである.setWindowという方法は、アプリケーションがバッテリを利用して納品バッチからの処理を最適化することを可能にするため、適切なタイムリーな要求アラートであっても.
主な問題
正直に言うと、これらの問題はきっとみんな出会ったことがあると信じています.そして、解決するのはかなり骨が折れています.確かにそうです.私たちがどのように一つ一つ解決するかを見てみましょう.
遭遇した穴を解決する
API 19以降の繰り返し目覚まし時計の設定方法
AlarmManagerを使用してアラートを設定した後、ブロードキャストで受信したことを知っています.設定されたアラート時間が来ると、システムはカスタムブロードキャストを送信し、受信し、アプリケーションのアラートを送信します.では、注意するとき、もう一度設定し直してもいいですか.これでAPI 19が繰り返し目覚まし時計を設定する問題が解決しました.
PendingIntent sender = PendingIntent.getBroadcast(context, id, intent, PendingIntent
.FLAG_CANCEL_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setWindow(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis()),
intervalMillis, sender);
} else {
if (flag == 0) {
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
} else {
am.setRepeating(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis
()), intervalMillis, sender);
}
}
システムバージョンを判断することにより、目覚まし時計をセットアップする方法が異なり、セットアップが行われます.次に、放送受信システムからの通知を受信し、目覚まし時計の注意を行います.
public class LoongggAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String msg = intent.getStringExtra("msg");
long intervalMillis = intent.getLongExtra("intervalMillis", 0);
if (intervalMillis != 0) {
AlarmManagerUtil.setAlarmTime(context, System.currentTimeMillis() + intervalMillis,
intent);
}
int flag = intent.getIntExtra("soundOrVibrator", 0);
Intent clockIntent = new Intent(context, ClockAlarmActivity.class);
clockIntent.putExtra("msg", msg);
clockIntent.putExtra("flag", flag);
clockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(clockIntent);
}
}
以上の放送では、API 19の後にアラームが繰り返されているか、0ではないかをその時間間隔がゼロであるかによって判断し、再設定されていることがわかります.setAlarmTime()という方法を見てみましょう.次のようになります.
public static final String ALARM_ACTION = "com.loonggg.alarm.clock";
public static void setAlarmTime(Context context, long timeInMillis, Intent intent) {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent sender = PendingIntent.getBroadcast(context, intent.getIntExtra("id", 0),
intent, PendingIntent.FLAG_CANCEL_CURRENT);
int interval = (int) intent.getLongExtra("intervalMillis", 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setWindow(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);
}
}
こうして、繰り返される問題は解決した.
携帯電話の再起動後、目覚まし時計の故障はどのように解決します
はい、携帯電話が再起動した後、目覚まし時計は確かに失効しました.この問題を解決するには、携帯電話の再起動を監視する放送をもう一つ設定し、携帯電話が再起動したときに、もう一度設定し直して、上記の問題を解決することができます.
携帯電話の再起動放送で、私がパッケージした目覚まし時計を再設定する方法を呼び出したのを見てみましょう.これにより、携帯電話の再起動後、目覚まし時計が無効になるという問題が解決しました.注意:放送はリストファイルに登録する必要があります.皆さん、忘れないでください.私はここでコードを貼らない.
アプリケーションが殺され、目覚まし時計が無効になりました
これは本当に良い解決策がありません.プログラムにサービスが書かれている場合は、サービスが再起動されたときに、目覚まし時計を再登録したり、アプリケーションを開いたときに再登録したりすることができます.どうせ目覚まし時計の登録に有利な場所で、再設定を行うことができます.目覚まし時計設定のidが同じであれば、後で設定した目覚まし時計は自動的に前に設定した目覚まし時計を上書きします.アプリが殺された後、目覚まし時計が無効になった問題を解決するのに良い人がいたら、共有してください.
このパッケージのクラスライブラリのメリット
メリットは、私が方法をパッケージ化して、直接呼び出すことができます.*直接時分割の値を入力すればいいです.例えば、ある时点に直接伝えます:12:30、それから毎日注意するかどうか、それとも周何注意するかなど*目覚まし时计の注意のインターフェース私もすでに中に封入して、まだきれいで、怠け者の学生はもう书く必要はありません.満足していない学生は直接クラスライブラリをダウンロードして修正することができます.*目覚まし時計をキャンセルする方法は、私もすでにパッケージしています.
要するに、とても便利で、いったいどれだけ便利なのか、みんなが直接demoを見て知っていて、満足していない学生は直接クラスライブラリをダウンロードして修正することができます.
demoとクラスライブラリアドレス:https://github.com/loonggg/Android-AlarmManagerClock
WeChatの公式アカウント:有名なプログラマーではない(smart_android)に注目して、毎日毎週オリジナル技術の文章を定期的にプッシュします.