AlarmManager触发较晚或根本不触发

时间:2016-02-26 10:15:39

标签: android alarmmanager

大家好,我正在尝试了解如何在Android中使用AlarmManagerBroadcastReceiver。 我在使用AlarmManager时遇到了一些问题: 我在1分钟的距离设置两个警报,但只有一个发出警报,并且延迟了几分钟(我猜不可预测)。

这是我的主要活动(我通过点击按钮设置警报)

public class MainActivity extends AppCompatActivity {
    AlarmManager alarmManager;
    Intent intent;
    PendingIntent pendingIntent;
    AtomicInteger atomicInteger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        intent = new Intent(Constants.EXTENDED_DATA_STATUS);
        atomicInteger = new AtomicInteger();
        setContentView(R.layout.activity_main);

        Button startButton = (Button) findViewById(R.id.start_button);

        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = atomicInteger.incrementAndGet();
                pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),id,intent,0);
                Calendar firstLullo = Calendar.getInstance();
                Calendar secondLullo = Calendar.getInstance();
                firstLullo.set(Calendar.HOUR_OF_DAY,10);
                firstLullo.set(Calendar.MINUTE,55);
                secondLullo.set(Calendar.HOUR_OF_DAY,10);
                secondLullo.set(Calendar.MINUTE,56);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP,firstLullo.getTimeInMillis(),pendingIntent);
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP,secondLullo.getTimeInMillis(),pendingIntent);
                }
                Log.d("ALARM","settato con id " + String.valueOf(id));
            }
        });
    }
}

我的接收器只显示一个Toast并使手机振动。 Constants.EXTENDED_DATA_STATUS是来自Constants类的字符串,并且已添加到Android Manifest中我的Reveiver的intent-filter

我缺少什么?我google了很多,发现我必须使用setExact(),但没有运气..

提前致谢

2 个答案:

答案 0 :(得分:4)

只有一次火灾的原因是你的取消你的第一个总是

  

来自文档:如果已经为同一个IntentSender安排了警报,那么先前的警报将被取消。

要解决此问题,请对两个警报使用不同的PendingIntents

- 要让您的接收方激活多次次,请在 {//export firstgrid Response.ClearContent(); Response.ClearHeaders(); DataTable dtGetReportBank = new DataTable(); dtGetReportBank = objPO.GetReportBank(id); gridData1.DataSource = dtGetReportBank; gridData1.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "BankCMS" + ".xls")); Response.ContentType = "application/ms-excel"; StringWriter sw1 = new StringWriter(); HtmlTextWriter htw1 = new HtmlTextWriter(sw1); gridData1.AllowPaging = false; dvContent.RenderControl(htw1); Response.Write(sw1.ToString()); Response.End(); Btn.Visible = false; } //export second grid { Response.ClearContent(); Response.ClearHeaders(); DataTable dtGetReportBank = new DataTable(); dtGetReportBank = objPO.GetReportBank(id); gridData.DataSource = dtGetReportBank; gridData.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "BankCMS" + ".xls")); Response.ContentType = "application/ms-excel"; StringWriter sw1 = new StringWriter(); HtmlTextWriter htw1 = new HtmlTextWriter(sw1); gridData.AllowPaging = false; dvContent.RenderControl(htw1); Response.Write(sw1.ToString()); Response.End(); Btn.Visible = false; }

中重新安排

示例: 只有你想要两个接收器彼此分开!

onReceive()

Manifest.XML

中注册闹钟
//Declare AlarmManager
AlarmManager am = (AlarmManager) LayoutActivity.this.getSystemService(ALARM_SERVICE);

//create new calendar instance for your first alarm
Calendar startTime= Calendar.getInstance();

//set the time of your first alarm
firstLullo.set(Calendar.HOUR_OF_DAY,10);
firstLullo.set(Calendar.MINUTE, 55);
firstLullo.set(Calendar.SECOND, 0);

//create a pending intent 
PendingIntent firstPI = PendingIntent.getBroadcast(yourActivity.this, 0, new Intent("yourFirstAlarmReceiver"), PendingIntent.FLAG_UPDATE_CURRENT);

//schedule time for pending intent, and set the interval to day so that this event will repeat at the selected time every day
am.setRepeating(AlarmManager.RTC_WAKEUP, firstAlarm.getTimeInMillis(), firstPI);

//----------------------------------------------------

//create new calendar instance for your second alarm
Calendar endCalender = Calendar.getInstance();

//Set the time alarm of your second alarm
secondLullo.set(Calendar.HOUR_OF_DAY,10);
secondLullo.set(Calendar.MINUTE,56);
secondLullo.set(Calendar.SECOND, 0);

//create a pending intent to be 
PendingIntent secondPI= PendingIntent.getBroadcast(yourActivity.this, 0, new Intent("yourSecondAlarmReceiver"), PendingIntent.FLAG_UPDATE_CURRENT);

//schedule time for pending intent, and set the interval to day so that this event will repeat at the selected time every day
am.setRepeating(AlarmManager.RTC_WAKEUP, secondLullo.getTimeInMillis(), secondPI);

现在,您可以通过以下方式拨打闹钟:

第一次警报:

<receiver android:name="firstAlarm" >
    <intent-filter>
        <action android:name="yourFirstAlarmReceiver" >
        </action>
    </intent-filter>
</receiver>

<receiver android:name="secondAlarm" >
    <intent-filter>
            <action android:name="yourSecondAlarmReceiver" >
            </action>
    </intent-filter>
</receiver>

第二次警报:

public class yourFirstAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    //Do something when first alarm goes off

    }
}

应该帮助你。

答案 1 :(得分:1)

是的,当然上面的代码只会触发一个警报,因为你为两个警报设置相同的id。

警报由pendingintent中的id识别和区分。

为不同的警报使用不同的ID

更新代码:

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1234 ,intent,0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP,firstLullo.getTimeInMillis(),pendingIntent);

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 5678, intent,0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP,secondLullo.getTimeInMillis(),pendingIntent);