編輯:關於Android編程
標簽(空格分隔): Android基礎入門教程
本節帶來的Android中的AlarmManager(鬧鐘服務),聽名字我們知道可以通過它開發手機鬧鐘類的APP,
而在文檔中的解釋是:在特定的時刻為我們廣播一個指定的Intent,簡單說就是我們自己定一個時間,
然後當到時間時,AlarmManager會為我們廣播一個我們設定好的Intent,比如時間到了,可以指向某個
Activity或者Service!另外官方文檔中有一些要注意的地方:另外要注意一點的是,AlarmManager主要是用來在某個時刻運行你的代碼的,即時你的APP在那個特定
時間並沒有運行!還有,從API 19開始,Alarm的機制都是非准確傳遞的,操作系統將會轉換鬧鐘
,來最小化喚醒和電池的使用!某些新的API會支持嚴格准確的傳遞,見
setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。
targetSdkVersion在API 19之前應用仍將繼續使用以前的行為,所有的鬧鐘在要求准確傳遞的情況
下都會准確傳遞。更多詳情可見官方API文檔:AlarmManager
如果你學過J2SE的話,那麼你對Timer肯定不會陌生,定時器嘛,一般寫定時任務的時候
肯定離不開他,但是在Android裡,他卻有個短板,不太適合那些需要長時間在後台運行的
定時任務,因為Android設備有自己的休眠策略,當長時間的無操作,設備會自動讓CPU進入
休眠狀態,這樣就可能導致Timer中的定時任務無法正常運行!而AlarmManager則不存在
這種情況,因為他具有喚醒CPU的功能,可以保證每次需要執行特定任務時CPU都能正常工作,
或者說當CPU處於休眠時注冊的鬧鐘會被保留(可以喚醒CPU),但如果設備被關閉,或者重新
啟動的話,鬧鐘將被清除!(Android手機關機鬧鐘不響…)
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
set(int type,long startTime,PendingIntent pi):一次性鬧鐘 setRepeating(int type,long startTime,long intervalTime,PendingIntent pi):
重復性鬧鐘,和3有區別,3鬧鐘間隔時間不固定 setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi):
重復性鬧鐘,時間不固定 cancel(PendingIntent pi):取消AlarmManager的定時服務 getNextAlarmClock():得到下一個鬧鐘,返回值AlarmManager.AlarmClockInfo setAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
和set方法類似,這個鬧鐘運行在系統處於低電模式時有效 setExact(int type, long triggerAtMillis, PendingIntent operation):
在規定的時間精確的執行鬧鐘,比set方法設置的精度更高 setTime(long millis):設置系統牆上的時間 setTimeZone(String timeZone):設置系統持續的默認時區 setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation):
設置一個鬧鐘在給定的時間窗觸發。類似於set,該方法允許應用程序精確地控制操作系統調
整鬧鐘觸發時間的程度。
關鍵參數講解:
Type(鬧鐘類型):
有五個可選值:
AlarmManager.ELAPSED_REALTIME:
鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啟動開始),狀態值為3;
AlarmManager.ELAPSED_REALTIME_WAKEUP
鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值為2;
AlarmManager.RTC
鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值為1;
AlarmManager.RTC_WAKEUP
表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值為0;
AlarmManager.POWER_OFF_WAKEUP
表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間,狀態值為4;不過本狀態好像受SDK版本影響,某些版本並不支持; startTime:鬧鐘的第一次執行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。
需要注意的是,本屬性與第一個屬性(type)密切相關,如果第一個參數對應的鬧鐘使用的是相對時間
(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那麼本屬性就得使用相對時間
(相對於系統啟動時間來說),比如當前時間就表示為:SystemClock.elapsedRealtime();
如果第一個參數對應的鬧鐘使用的是絕對時間(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),
那麼本屬性就得使用絕對時間,比如當前時間就表示 為:System.currentTimeMillis()。 intervalTime:表示兩次鬧鐘執行的間隔時間,也是以毫秒為單位. PendingIntent:綁定了鬧鐘的執行動作,比如發送一個廣播、給出提示等等。
PendingIntent是Intent的封裝類。需要注意的是,如果是通過啟動服務來實現鬧鐘提 示的話,PendingIntent對象的獲取就應該采用Pending.getService
(Context c,int i,Intent intent,int j)方法;如果是通過廣播來實現鬧鐘
提示的話,PendingIntent對象的獲取就應該采用 PendingIntent.getBroadcast
(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式來實
現鬧鐘提示的話,PendingIntent對象的獲取就應該采用
PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。
如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。
要說的是,此例子只在Android 4.4以下的系統可行,5.0以上並不可行,後續如果有5.0
以上AlarmManager的解決方案,到時再補上!另外,這裡用set方法可能有點不准,如果要
更精確的話可以使用setExtra()方法來設置AlarmManager!
運行效果圖:
實現代碼:
首先一個簡單的布局文件:activity_main.xml,另外在res創建一個raw文件夾,把音頻文件丟進去!
另外創建一個只有外層布局的activity_clock.xml作為鬧鐘響時Activity的布局!沒東西,就不貼了
接著是MainActivity.java,也很簡單:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_set;
private Button btn_cancel;
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
}
private void bindViews() {
btn_set = (Button) findViewById(R.id.btn_set);
btn_cancel = (Button) findViewById(R.id.btn_cancel);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, ClockActivity.class);
pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
btn_set.setOnClickListener(this);
btn_cancel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_set:
Calendar currentTime = Calendar.getInstance();
new TimePickerDialog(MainActivity.this, 0,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
//設置當前時間
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
// 根據用戶選擇的時間來設置Calendar對象
c.set(Calendar.HOUR, hourOfDay);
c.set(Calendar.MINUTE, minute);
// ②設置AlarmManager在Calendar對應的時間啟動Activity
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
Log.e(HEHE,c.getTimeInMillis()+); //這裡的時間是一個unix時間戳
// 提示鬧鐘設置完畢:
Toast.makeText(MainActivity.this, 鬧鐘設置完畢~+ c.getTimeInMillis(),
Toast.LENGTH_SHORT).show();
}
}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
.get(Calendar.MINUTE), false).show();
btn_cancel.setVisibility(View.VISIBLE);
break;
case R.id.btn_cancel:
alarmManager.cancel(pi);
btn_cancel.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, 鬧鐘已取消, Toast.LENGTH_SHORT)
.show();
break;
}
}
}
然後是鬧鈴頁面的ClockActivity.java:
/**
* Created by Jay on 2015/10/25 0025.
*/
public class ClockActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
mediaPlayer = mediaPlayer.create(this,R.raw.pig);
mediaPlayer.start();
//創建一個鬧鐘提醒的對話框,點擊確定關閉鈴聲與頁面
new AlertDialog.Builder(ClockActivity.this).setTitle(鬧鐘).setMessage(小豬小豬快起床~)
.setPositiveButton(關閉鬧鈴, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mediaPlayer.stop();
ClockActivity.this.finish();
}
}).show();
}
}
代碼非常簡單,核心流程如下:
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
獲得系統提供的AlarmManager服務的對象 Intent設置要啟動的組件:
Intent intent = new Intent(MainActivity.this, ClockActivity.class); PendingIntent對象設置動作,啟動的是Activity還是Service,又或者是廣播!
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); 調用AlarmManager的set( )方法設置單次鬧鐘的鬧鐘類型,啟動時間以及PendingIntent對象!
alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);
另外假如出現鬧鈴無效的話,你可以從這些方面入手:
1.系統版本或者手機,5.0以上基本沒戲,小米,自行百度吧~
2.ClockActivity有注冊沒?
3.假如你用的是alarmManager發送廣播,廣播再激活Activity的話,則需要為Intent設置一個flag:
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4.
這些地方沒寫錯吧~別把getActivity寫成了getService等哦~
另外,關於AlarmManager結合後來Service實現定時後台任務的例子,可見:
Android基礎入門教程——4.2.2 Service進階
認識ReactReact是一個用於構建用戶界面的JavaScript庫。 React主要用於構建UI,很多人認為React是MVC中的V,即視圖。 React起源於Fac
1.構建一張七彩圖:我們經常看到這種樣子的顏色選擇器吧..然後其實右邊的亮度選擇是:這樣我們的代碼就可以進行啦... // 創建七彩圖片 private voi
這次做一個圖片加載器,裡面涉及到線程池,bitmap的高效加載,LruCache,DiskLruCache。接下來我先介紹這四個知識點一.線程池優點:(1)重用線程池中的
我手機的關於手機界面:說明:其中手機型號、Android版本、軟件版本通過系統Build類得到,處理器信息、內核版本通過讀取系統文件得到,基帶版本信息通過反射得到。&nb