Android开发之AlarmManager的使用(开启Activity、开启服务、开启广播)

来源:互联网 发布:家装设计软件 编辑:程序博客网 时间:2024/06/10 00:27

Android开发之AlarmManager的使用(开启Activity、开启服务、开启广播)


近来做项目,需要在固定的时间间隔内开启一次广播,本人立马想到了Alarmmanager,在此就科普下,描述下本人的实现过程吧!

1.
AlarmManager,是Android中常用的一种系统级别的提示服务
 使用AlarmManager可为我们在特定的时刻为我们广播一个指定的Intent!
 PendingIntent 可理解为是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的!

2.
AlarmManager的常用方法:

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)

该方法用于取消闹钟

3.int type:
AlarmManager.POWER_OFF_WAKEUP
AlarmManager.ELAPSED_REALTIME
AlarmManager.ELAPSED_REALTIME_WAKEUP
AlarmManager.RTC
AlarmManager.RTC_WAKEUP

AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能
该状态下闹钟也是用绝对时间,状态值为4;

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);    }}


效果图如下:





代码已贴出,正所谓取之于社会,回报于社会,还望各位大神批评指正,不喜勿喷,灰常感谢♪(^∇^*)






0 0
原创粉丝点击