Android Alarm的使用

本文主要是介绍Android Alarm的用法,如何开启和关闭它。

众所周知,设定alarm的话,大概需要用到如下几步:

1.创建一个Intent

2.创建一个PendingIntent

3.得到ALARM_SERVICE的AlarmManager

4.使用AlarmManager的set api,假如是取消,那就使用cancel

详细请看代码:

1.MainActivity.java

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener { 
	private String TAG="MainActivity";
    static final String TEST_INTENT = "com.example.testintent";  
    static final String ID = "id";  
    static final String TIME = "alarm_time";  
    int id;  
    Button addBtn;  
    Button cancelBtn;  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        id =2;  
        addBtn = (Button) findViewById(R.id.start_btn);  
        cancelBtn = (Button) findViewById(R.id.stop_btn);  
        addBtn.setOnClickListener(this);  
        cancelBtn.setOnClickListener(this);  
    }  
    @Override  
    public void onClick(View v) {  
        if (v == addBtn){  
            AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
            Intent intent = new Intent(TEST_INTENT);  
            intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));  
            intent.setClass(this, AlarmReceiver.class);  
            intent.putExtra(ID, id);  
            long atTimeInMillis = System.currentTimeMillis() + 2000;  
            intent.putExtra(TIME, atTimeInMillis);  
            PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
            am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);  
            Log.d(TAG,"add alarm");  
        }  
        else if (v == cancelBtn){  
            AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
            Intent intent = new Intent(TEST_INTENT);  
            intent.setClass(this, AlarmReceiver.class);  
            intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));  
            PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_NO_CREATE);  
            if (sender != null){  
                Log.d(TAG,"cancel alarm");  
                am.cancel(sender);  
            }else{  
                Log.d(TAG,"sender == null");  
            }  
        }  
          
    }  
      
}  

2.AlarmReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver{
private String TAG="AlarmReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String action = intent.getAction();  
        int id = intent.getIntExtra("id", -1);  
        long alarmtime= intent.getLongExtra("alarm_time", -1);  
        Log.d(TAG,"received action = "+action+", id = "+id+ ", alarmtime = "+alarmtime);  
        Toast.makeText(context, "received action = "+action+", id = "+id, Toast.LENGTH_SHORT).show();  
	}

}

3.布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
   >  
     
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textStyle="bold"  
        android:textSize="24dip"  
        android:layout_gravity="center"  
        android:text="Alarm打开与关闭测试 "/>  
      
    <Button  
         android:id="@+id/start_btn"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="打开"  
        />  
    <Button  
         android:id="@+id/stop_btn"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="关闭"  
        />  
    </LinearLayout>  

4.配置文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.usealarm"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <receiver android:name=".AlarmReceiver">  
            <intent-filter>  
                <action android:name="com.example.testintent" />  
                <data android:mimeType="vnd.android.cursor.item/calendar-alert" />  
            </intent-filter>  
        </receiver>  
    </application>

</manifest>


补充:

1.add中Intent里面的setData使用的值,必须和cancel中intent里面setData用的值一样,否则点击cancel是没法取消掉的,或者你不setData,那也是没法取消的

2.add中Intent里边的setClass使用的值也必须和cance中intent使用的一样,不然也cancel不掉,不setClass也cancel不了。

3.Intent中的putExtra是无效的,根本不起区别的作用

4.getBroadcast的第二个参数,一般的ap都是写0,其实假如你前面的intent只有setAction过,那么单纯用reqeustCode也是可以区别不同的alarm的。

5.通常cancel之前可以先用PendingIntent.FLAG_NO_CREATE来判断之前是不是设定了这个alarm,假如没设定,那就不要去调用cancel



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值