Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android廣播事件處理broadcast receive -鬧鐘實例(運用alarmmanager)

android廣播事件處理broadcast receive -鬧鐘實例(運用alarmmanager)

編輯:Android開發實例

對應AlarmManage有一個AlarmManagerServie服務程序,該服務程序才是正真提供鬧鈴服務的,它主要維護應用程序注冊下來的各類鬧鈴並適時的設置即將觸發的鬧鈴給鬧鈴設備(在系統中,linux實現的設備名為”/dev/alarm”),並且一直監聽鬧鈴設備,一旦有鬧鈴觸發或者是鬧鈴事件發生,AlarmManagerServie服務程序就會遍歷鬧鈴列表找到相應的注冊鬧鈴並發出廣播。該服務程序在系統啟動時被系統服務程序system_service啟動並初始化鬧鈴設備(/dev/alarm)。當然,在JAVA層的AlarmManagerService與Linux Alarm驅動程序接口之間還有一層封裝,那就是JNI。

  AlarmManager將應用與服務分割開來後,使得應用程序開發者不用關心具體的服務,而是直接通過AlarmManager來使用這種服務。這也許就是客戶/服務模式的好處吧。AlarmManager與 AlarmManagerServie之間是通過Binder來通信的,他們之間是多對一的關系。

     在android系統中,AlarmManage提供了3個接口5種類型的鬧鈴服務。

 

3個接口:

 
  • // 取消已經注冊的與參數匹配的鬧鈴    
  •  void   cancel(PendingIntent operation)
  1.  
  2.   //注冊一個新的鬧鈴   
  3.  void   set(int type, long triggerAtTime, PendingIntent operation)   
  4.   //注冊一個重復類型的鬧鈴   
  5.  void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)   
  6.     //設置時區   
  7.  void   setTimeZone(String timeZone)  

 

 

5個鬧鈴類型

 

public   static final int ELAPSED_REALTIME               
  1.  //當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啟動後開始計時的,包括睡眠   
  2. 時間,可以通過調用SystemClock.elapsedRealtime()獲得。系統值是3    (0x00000003)。   
  3.         public static final int ELAPSED_REALTIME_WAKEUP   
  4.         //能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。   
  5.         public static final int RTC   
  6.            
  7.  //當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過調用   
  8.  System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。   
  9.         public static final int RTC_WAKEUP   
  10.         //能喚醒系統,用法同RTC類型,系統值為 0 (0x00000000) 。   
  11.         Public static final int POWER_OFF_WAKEUP   
  12.            
  13.  //能喚醒系統,它是一種關機鬧鈴,就是說設備在關機狀態下也可以喚醒系統,所以我們把它稱之為關機鬧鈴。使用方法同RTC類型,系統值為   
  14.  4(0x00000004)。      

    注意一個重要的參數PendingIntent。這個PendingIntent可以說是 Intent的進一步封裝,他既包含了Intent的描述又是Intent行為的執行(這種定義也許不太嚴格),如果將Intent比作成一個訂單的話,PendingIntent更像是一個下訂單的人,因為它既要負責將訂單發出去,也要負責訂單發送後的處理,比如發送成功後要准備驗收訂單貨物,發送失敗後要重發還是取消訂單等操作。開發者可以通過調用getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

 

 

三種不同方式來得到一個PendingIntent實例。

getBroadcast——通過該函數獲得的PendingIntent將會扮演一個廣播的功能,就像調用 Context.sendBroadcast()函數一樣。當系統通過它要發送一個intent時要采用廣播的形式,並且在該intent中會包含相應的 intent接收對象,當然這個對象我們可以在創建PendingIntent的時候指定,也可以通過ACTION 和CATEGORY等描述讓系統自動找到該行為處理對象。

 

 

 

 

 

 

 

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

 

getActivity——通過該函數獲得的PendingIntent可以直接啟動新的activity, 就像調用 Context.startActivity(Intent)一樣.不過值得注意的是要想這個新的Activity不再是當前進程存在的Activity 時。我們在intent中必須使用Intent.FLAG_ACTIVITY_NEW_TASK.

 

 

 

 

 

 

 

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

 

getService——通過該函數獲得的PengdingIntent可以直接啟動新的Service,就像調用Context.startService()一樣。

 

 

 

 

 

 

// Create an IntentSender that will launch our service, to be scheduled   

  // with the alarm manager.   

  1.     mAlarmSender = PendingIntent.getService(AlarmService.this ,     0 ,  new  Intent(AlarmService. this , AlarmService_Service. class ),  0 ); 

  

實例:

/Chapter08_Broadcast_AlarmManager/src/com/amaker/ch08/app/MainActivity.java

 

   

package com.amaker.ch08.app;

import com.amaker.ch08.app.R;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
*
* 測試AlarmManager
*/
public class MainActivity extends Activity {
// 聲明Button
private Button setBtn, cancelBtn;
// 定義廣播Action
private static final String BC_ACTION = "com.amaker.ch08.app.action.BC_ACTION";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設置當前布局視圖
setContentView(R.layout.main);

// 實例化Button
setBtn = (Button) findViewById(R.id.Button01);
cancelBtn = (Button) findViewById(R.id.Button02);

// 獲得AlarmManager實例
final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

// 實例化Intent
Intent intent = new Intent();
// 設置Intent action屬性
intent.setAction(BC_ACTION);
intent.putExtra("msg", "你該去開會啦!");
// 實例化PendingIntent
final PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,
intent, 0);
// 獲得系統時間
final long time = System.currentTimeMillis();

// 設置按鈕單擊事件
setBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 重復提示,從當前時間開始,間隔5秒
am.setRepeating(AlarmManager.RTC_WAKEUP, time,
8 * 1000, pi);
}
});

// 設置按鈕單擊事件
cancelBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
am.cancel(pi);
}
});
}
}

/Chapter08_Broadcast_AlarmManager/src/com/amaker/ch08/app/MyReceiver.java

 
package com.amaker.ch08.app;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 獲得提示信息
String msg = intent.getStringExtra("msg");
// 顯示提示信息
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
}
}

/Chapter08_Broadcast_AlarmManager/res/layout/main.xml

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:text="設置鬧鐘"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button
android:text="取消鬧鐘"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>

/Chapter08_Broadcast_AlarmManager/AndroidManifest.xml

 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.ch08.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.amaker.ch08.app.action.BC_ACTION"/>
</intent-filter>
</receiver>

</application>
<uses-sdk android:minSdkVersion="3" />

</manifest>

 

  1. // 取消已經注冊的與參數匹配的鬧鈴    
  2.  void   cancel(PendingIntent operation)   

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved