onReceive()永远不会使用AlarmManager调用

时间:2014-02-07 05:22:00

标签: android android-broadcast

好吧,我一整天都坐在这个常见的问题上...... 所以在这里,这是设置警报的方法:

public void fireAlarm(int Year,int Month,int Day,int Hour,int Min,int Sec)
{
    Calendar calendar=Calendar.getInstance();
    calendar.set(Year, Month, Day, Hour, Min,Sec);
    Intent intent = new Intent(this, AlarmReciver.class);
    PendingIntent penintent = PendingIntent.getBroadcast(this.getApplicationContext(),234324,intent,0);
    AlarmManager alm = (AlarmManager)getSystemService(ALARM_SERVICE);
    alm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), penintent);

这是BroadcastReciver:

package il.co.galrom;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class AlarmReciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Log.i("alarm","alarm worked");  
    }

}

这是我的清单:

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="il.co.galrom.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="il.co.galrom.AlarmReciver"></receiver>

    </application>
</manifest

在LogCat中,我可以看到brodcast正在发生,但OnRecieve()永远不会被调用

谢谢!

2 个答案:

答案 0 :(得分:1)

问题最可能出在这一行

alm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), penintent);

此处的第二个参数应该是以毫秒为单位的时间,之后警报应该消失。例如,如果你希望它在那一刻发射,那么它应该是0,否则为1000秒,依此类推。

看起来你正在向参数传递一个很大的值(从年,月等参数来判断)。

答案 1 :(得分:1)

代码本身正在发挥作用。

常见的缺陷是压缩月参数为零索引。 如果你想为2月份设置闹钟,你需要将1作为你的月份参数传递给fireAlarm函数