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

本文介绍了如何使用AlarmManager在Android中开启Activity、服务和广播。讲解了AlarmManager的设置方法,包括一次性与重复闹钟,以及不同类型的触发时机如ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC和RTC_WAKEUP。还强调了triggerAtMillis和intervalTime的正确使用,并提供核心代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


效果图如下:





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






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值