AndroidアラームサービスAlarmManagerの使い方を深く分析します。


本論文の実例はAndroidアラームサービスAlarmManagerの使い方を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
AlarmManageに対応するAlarmManager Servieサービスプログラムがあります。このサービスは本当にアラームサービスを提供しています。アプリケーションに登録された各種アラームを主に維持し、タイムリーに設定するとアラームデバイスにアラームがかかります。アラームが発生すると、またはアラームイベントが発生すると、アラムManagerServieサービスプログラムは、アラームリストを巡回して登録されたアラームを見つけ、放送を開始します。このサービスプログラムはシステム起動時にシステムサービスプログラムsystem_serviceが起動し、アラームデバイス(/dev/alarm)を初期化します。もちろん、JAVA層のAlarmManagerServiceとLinux Alarmドライバインターフェースの間にもう一つのパッケージがあります。それはJNIです。
AlarmManagerがアプリケーションとサービスを切り離した後、アプリケーション開発者が具体的なサービスに関心を持たず、直接AlarmManagerを通してこのサービスを利用するようになりました。これはお客様/サービスモードのメリットかもしれません。AlarmManagerとAlarmManager Servieの間はBinderを通じて通信しています。彼らの間は複数の対一の関係です。
Androidシステムでは、AlarmManageは3つのインターフェース5種類のアラームサービスを提供しています。
3つのインターフェース:

//                
void cancel(PendingIntent operation)
//        
void set( int type, long triggerAtTime, PendingIntent operation)
//           
void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation)
//    
void setTimeZone(String timeZone)

Javaコード:

//                
void cancel(PendingIntent operation)
 //        
void set(int type, long triggerAtTime, PendingIntent operation)
 //           
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
 //    
void setTimeZone(String timeZone)

5つのアラームタイプ

public static final int ELAPSED_REALTIME
//           ,             。             ,             ,            ,       ,      SystemClock.elapsedRealtime()  。    3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
//     ,   ELAPSED_REALTIME,    2 (0x00000002) 。
public static final int RTC
//          ,             。             ,             ,     UTC  ,       System.currentTimeMillis()  。    1 (0x00000001) 。
public static final int RTC_WAKEUP
//     ,   RTC  ,     0 (0x00000000) 。
Public static final int POWER_OFF_WAKEUP
//     ,        ,                  ,             。     RTC  ,    4(0x00000004)。

Javaコード:

public static final int ELAPSED_REALTIME
//          ,             。             ,             ,            ,    
  ,      SystemClock.elapsedRealtime()  。    3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
//     ,   ELAPSED_REALTIME,    2 (0x00000002) 。
public static final int RTC
//          ,             。             ,             ,     UTC  ,      
 System.currentTimeMillis()  。    1 (0x00000001) 。
public static final int RTC_WAKEUP
//     ,   RTC  ,     0 (0x00000000) 。
Public static final int POWER_OFF_WAKEUP
//     ,        ,                  ,             。     RTC  ,    
4(0x00000004)。

重要なパラメータPendingIntentに注目してください。このPendingIntentはIntentのさらなるパッケージと言えます。Intentの記述とIntentの行動の実行(この定義はあまり厳密ではないかもしれません。)を含んでいます。Intentを注文書にたとえれば、PendingIntentは注文を出す人のようです。注文書を発送した後の処理を担当します。例えば発送が成功したら注文品の検収を準備して、発送が失敗したら再送しますか?それとも注文をキャンセルしますか?開発者は呼び出しにより
getActivity(Conttext,int,Intent,int)
get Broadcast(Contect,int,Intent,int)
get Service(Conttext,int,Intent,int)
3つの異なる方法でPendingIntentの例を得る。
get Broadcast――この関数を通じて得られたPendingIntentはContect.sendBroadcast()関数を呼び出すような放送機能を演じる。システムがintentを送信する際にはブロードキャストを採用し、そのintentには対応するintent受信対象が含まれています。もちろん、この対象はPendingIntentを作成する際に指定してもいいし、ACT IONやCATEGORYなどを通じてシステムに自動的にこの行動処理対象を見つけさせることもできます。

Intent intent = new Intent(AlarmController. this , OneShotAlarm. class );
PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this , 0 , intent, 0 );

Javaコード:

Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);

get Activity――この関数によって得られたPendingIntentは、直接に新しいactivityを起動し、Contect.startActivityを呼び出すようになります。ただし、この新しいActivityが現在のプロセスに存在しているActivityではないということを考えるときは注意が必要です。私たちはintentでIntent.FLAG_を使わなければなりません。ACT IVITY_NEW_TASK.

// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this , 0 , new Intent( this , AlarmService. class ), 0 );

Javaコード:

// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, AlarmService.class), 0);

get Service――この関数によって得られたPengdingIntentは、Contact.startServiceを呼び出すように、新しいServiceを直接起動することができます。

// Create an IntentSender that will launch our service, to be scheduled
// with the alarm manager.
mAlarmSender = PendingIntent.getService(AlarmService.this ,
 0 , new Intent(AlarmService. this , AlarmService_Service. class ), 0 );

Android関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Android開発入門と上級教程」、「Androidデバッグ技術とよくある問題解決方法のまとめ」、「Androidマルチメディア操作技術まとめ(オーディオ、ビデオ、録音など)」、「Android基本コンポーネントの使い方のまとめ」、「AndroidビューViewテクニックのまとめ」、「Androidレイアウトlayout技巧まとめ」および「Androidコントロールの使い方のまとめ
ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。