Android开发之AlarmManager的使用(开启Activity、开启服务、开启广播)
a.
void set(int type, long triggerAtMillis, PendingIntent operation)
该方法用于设置一次性闹钟,type表示闹钟类型,triggerAtMillis闹钟执行时间,operation表示闹钟响应动作。
b.
void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
该方法用于设置重复闹钟,type表示闹钟类型,triggerAtMillis表示闹钟首次执行时间,intervalTime表示闹钟两次执行的间隔时间,operation表示闹钟响应动作。
c.
void setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
该方法用于设置重复闹钟,type表示闹钟类型,triggerAtMillis表示闹钟首次执行时间,operation表示闹钟响应动作。该方法与上一个方法相似,只是两次闹钟执行的间隔时间不是固定的!
d.
void cancel(PendingIntent operation)
AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用
该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,
该状态下闹钟也使用相对时间,状态值为2;
AlarmManager.RTC表示闹钟在睡眠状态下不可用,
该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;
AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能
该状态下闹钟使用绝对时间,状态值为0;
longtriggerAtMillis:
闹钟的第一次执行时间,以毫秒为单位
特别注意:
本属性根据type的不同而使用不同的时间
若type对应的闹钟使用的是相对时间ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则triggerAtMillis就得使用相对时间(从系统启动时间算起)
eg:当前时间即:SystemClock.elapsedRealtime();
如果第一个参数对应的闹钟使用的是绝对时间 RTC、RTC_WAKEUP或POWER_OFF_WAKEUP,则triggerAtMillis就得使用绝对时间
eg:当前时间即:System.currentTimeMillis();
long intervalTime:
表示闹钟两次执行的间隔时间,以毫秒为单位
PendingIntent operation:
绑定了闹钟的执行动作
通过
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, @Flags int flags) { return getActivity(context, requestCode, intent, flags, null); }
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, @Flags int flags) { return getBroadcastAsUser(context, requestCode, intent, flags, new UserHandle(UserHandle.myUserId())); }
public static PendingIntent getService(Context context, int requestCode, @NonNull Intent intent, @Flags int flags) { String packageName = context.getPackageName(); String resolvedType = intent != null ? intent.resolveTypeIfNeeded( context.getContentResolver()) : null; try { intent.prepareToLeaveProcess(); IIntentSender target = ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_SERVICE, packageName, null, null, requestCode, new Intent[] { intent }, resolvedType != null ? new String[] { resolvedType } : null, flags, null, UserHandle.myUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } return null; }这三个方法进行实例化,在intent中指定动作即可
科普完毕,直接贴代码了:
核心代码:
package com.hxht.testalarmmanager; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.hxht.testalarmmanager.service.AlarmService; public class MainActivity extends AppCompatActivity { private AlarmManager manager; private PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } /** * 初始化 */ private void init() { manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); } /** * 广播 * * @param view */ public void toStartAlarmForBroadcast(View view) { Intent intent = new Intent("FlyingSnow2211"); pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent,0); /** * 定义重复提醒:间隔5秒后发送一次广播 */ manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5 * 1000, 5 * 1000, pendingIntent); } /** * 服务 * * @param view */ public void toStartAlarmForService(View view) { Intent intent = new Intent(MainActivity.this, AlarmService.class); pendingIntent = PendingIntent.getService(MainActivity.this, 0,intent,0); /** * 定义重复提醒:间隔不固定时间开启一次服务 */ manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + 3 * 1000,3* 1000,pendingIntent); } /** * Activity * * @param view */ public void toStartAlarmForActivity(View view) { Intent intent = new Intent(MainActivity.this, AlarmActivity.class); pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent,0); /** * 定义提醒,在指定时间内开启一次Activity */ manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3 * 1000, pendingIntent); } /** * 取消闹钟 * * @param view */ public void toStopAlarm(View view) { manager.cancel(pendingIntent); } }
效果图如下:
代码已贴出,正所谓取之于社会,回报于社会,还望各位大神批评指正,不喜勿喷,灰常感谢♪(^∇^*)