Ⅰ android定時的基本實現
在Android中大概又兩種實現方式:一種是java中的Timer類,一種是Android中的Alerm機制。兩者功能差不多。
Alerm具有cup運行鎖,而Timer不具有cpu鎖。
每種手機都具有自己的休眠策略,當長時間不是手機的情況下,cpu就會進入休眠狀態。在這種情況下Timer將無法工作。而Alerm具有cpu鎖,將會導致cpu無法休眠。
AlarmManager manger=(AlarManger)getSystemService(Context.ALARM_SERVICE);
manger.set(int flag,long time,PendingIntent pendingIntent);
set方法參數說明:
第一個參數flag為工作類型:
AlarmManger .ELAPSED_REALTIME:讓定時時間從開機算起時間算起,但不會喚醒cpu。
AlarmManger.ELAPSED_REALTIME_WAKEUP:同樣表示讓定時時間從開機算起,但會喚醒 激辯運 CPU。
RTC:表示讓定時任務從1970年1月1日算起,但是不喚醒cpu。
RTC_WAKEUP:表示讓定時任務從1970年1月1日算起,但是喚醒cpu。
提示:SystemClock.elapsedReadtime()---獲取系統開機至今所經歷的毫秒數;
System.currentTimeMillis()-------方法獲取1970年1月1日至今天的毫秒數;
第二個參數: 延時的時間,單位毫秒;
第三個參數: PendingIntent指定具體動作;
注意:Android4.4版本後set方法觸發不準確,有可能會延時一段時間執行(這不是Bug,是電池性能優化,系統會檢測目前有多少個Alarm任務存在,然後將觸發相近的幾個任務一起灶團執行)
如果要精確執行,將 setExact() 方法代替set()方法。
cancel ( PendingIntent operation )
方法將會取消Intent匹配的任何鬧鍾。
setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);
參數說明:interval重復時間間隔;(4.4後觸發不準時)
AlarmManger的其它功能:
設置系統時間和時區
添加許可權:android.permission.SET_TIME;
通過setTime(long millis)方法設置系統時間;
需要添加android.permission.SET_TIME_ZONE許可權。
通過setTimeZone(String tz)方法明梁設置時區;
Ⅱ Android AlarmManger+service設置通知欄定時推送,清理後失效
我自己整理的:
有問題再問我吧。
Ⅲ android中如何實現定時提醒
android中可以使用鬧鍾進行提醒,你只需要告知系統你想在什麼時候被提醒,然後需要一個鬧鍾的廣播接收器,當到你設置的時間時,系統會給你發送一條廣播,當你接收到廣播後你就可以做一些操作,比如啟動你的app,或者跳轉到你app中的任何一個界面。代碼如下:
//發送鬧鍾請求
Intent intent = new Intent(mContext, AlarmReceiver.class);
intent.setAction("something");
intent.setType("something");
intent.setData(Uri.EMPTY);
intent.addCategory(「something」);
intent.setClass(context, AlarmReceiver.class);
// 以上給intent設置的四個屬性是用來區分你發給系統的鬧鍾請求的,當你想取消掉之前發的鬧鍾請求,這四個屬性,必須嚴格相等,所以你需要一些比較獨特的屬性,比如伺服器返回給你的json中某些特定欄位。
//當然intent中也可以放一些你要傳遞的消息。
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCount, intent, 0);
//alarmCount是你需要記錄的鬧鍾數量,必須保證你所發的alarmCount不能相同,最後一個參數填0就可以。
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
//這樣鬧鍾的請求就發送出去了。time是你要被提醒的時間,單位毫秒,注意不是時間差。第一個參數提醒的需求用我給出的就可以,感興趣的朋友,可以去google一下,這方面的資料非常多,一共有種,看一下就知道區別了。
//取消鬧鍾請求
Intent intent = new Intent(mContext, AlarmReceiver.class);
intent.setAction("something");
intent.setType(something);
intent.setData(Uri.EMPTY);
intent.addCategory(something);
intent.setClass(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alarmCount, intent, 0);
//alarmCount對應到你設定時的alarmCount,
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
am.cancel(pendingIntent);
//接著,你需要一個廣播接收的類:
public class AlarmReceiver extends BroadcastReceiver{
private NotificationManager manager;
@Override
public void onReceive(Context context, Intent intent) {
manager = (NotificationManager)context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
//例如這個id就是你傳過來的
String id = intent.getStringExtra("id");
//MainActivity是你點擊通知時想要跳轉的Activity
Intent playIntent = new Intent(context, MainActivity.class);
playIntent.putExtra("id", id);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, playIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle("title").setContentText("提醒內容").setSmallIcon(R.drawable.app_icon).setDefaults(Notification.DEFAULT_ALL).setContentIntent(pendingIntent).setAutoCancel(true).setSubText("二級text");
manager.notify(1, builder.build());
}
}
Ⅳ android 設置系統鬧鍾和系統日歷提醒
現在有一個定時提醒的功能, 用 AlarmManager 自己來做,有多少坑做過的都知道。(應用被kill, 應用保活,息屏,關機重啟,多版本兼容問題。。。)。要自己做一個完善的不是 1-2天就能搞定的。當然如果是應用內簡單的定時執行,定時提醒 AlarmManager 還是很好用的。
https://www.jianshu.com/p/1f919c6eeff6
對於這種需求可以調用系統鬧鍾或用系統日歷的提醒事件來做。
日歷提醒功能可以直接用 Intent 起日歷提醒界面,這樣最簡單,不需要許可權。
調用API 直接設置需要動態申請許可權
https://www.cnblogs.com/loaderman/p/10489592.html
https://developer.android.com/guide/topics/providers/calendar-provider
設置系統鬧鍾需要 SET_ALARM 許可權
取消鬧鍾用 AlarmClock.ACTION_DISMISS_ALARM
Ⅳ android 中alarm是什麼意思
alarm的意搭歲廳思是知隱定雀此時任務。
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, R.string.hello_world, Toast.LENGTH_SHORT).show(); } }