2013-10-17 89 views
3

我正尝试使用相对简单的解决方案在启动时执行一些代码。基本上我想要在启动时安排/重新安排闹钟来执行某个任务。BOOT_COMPLETED上的Android BroadcastReceiver未启动报警

在我的表现,我有:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<receiver android:name="com.cswt.lcyairport.alarm.AlarmReceiver"> 
    <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

而且我的代码:

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 

    String action = intent.getAction(); 
    if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { 

     // Setup alarm 
     scheduleAlarm(); 

     //Intent pushIntent = new Intent(context, MainActivity.class); 
     //pushIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     //context.startActivity(pushIntent); 

    } 

} 

private void scheduleAlarm() { 
    long interval = 10*1000; 

    Intent intentAlarm = new Intent(AlarmReceiver.ACTION_GO_TO_GATE); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager)  context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 10000, interval, pendingIntent); 
} 

如果我取消的代码来启动它的伟大工程的活动,我看到BOOT_COMPLETED是我的接收器捕获。但是,尝试启动警报不起作用(也尝试显示通知,但它不起作用)。 我该如何解决这个问题?

+0

你注册了你的接收器吗? –

+0

显然我不需要...如果我想打开一个活动它的作品。 – Rui

+1

您是否为AlarmReceiver.ACTION_GO_TO_GATE注册了broadcastreceiver?如果是这样,你是否在清单中做过? –

回答

0

您是否已将必要的权限添加到清单中? ?

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
+0

我的帖子的第二行。 – Rui

+0

对不起,错过了那一个。你可以添加你的广播接收器的代码,该代码应该对AlarmReceiver.ACTION_GO_TO_GATE起作用吗? –

3

你必须使用不同的请求代码,并将其保存在某处reboots.You必须使用你已经可以用来设置的PendingIntent你报警了同样的要求代码设备后再次使用。然后它将在重新启动后工作。而且你还必须确保请求代码不再被使用,因为假设你设置了一个带请求代码0 wit.h PendingIntent的告警,那么如果你设置了另一个告警请求代码0,那么你以前的告警将被更新的告警代替一。所以,你不会得到第一个闹钟。

编辑: 与下面的代码段设置闹钟

public void SetAlarm(Calendar calendar, int reqCode) { 

String dateName = idea.getText().toString(); String dateNote = 
note.getText().toString(); Log.d("SetAlarm Texts", "Date : " + dateName + " 
Note: " + dateNote); 

Intent myIntent = new Intent(mActivity, AlarmReceiver.class); 

myIntent.putExtra("title", "Her : " + dateName); 

myIntent.putExtra("notes", dateNote); 

myIntent.putExtra("code", reqCode); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(mActi vity, reqCode, myIntent, 0); 

AlarmManager alarmManager = (AlarmManager) mActivity.getSystemService(Context.ALARM_ SERVICE); 

alarmManager.set(AlarmManager.RT C, calendar.getTimeInMillis(), pendingIntent); 

} 
+0

这似乎没有道理。在启动时,我正在设置闹钟,所以我不在这里重复请求代码。 – Rui

+0

通过服务设置警报。使用代码片段设置警报。 – ayon

1

你必须使用标志FLAG_UPDATE_CURRENT在创建使用任何的getService,getActivity或getBroadCast.so它保持当前未决intent.it不会取代未决意图it.please反驳这个链接http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

Intent in = new Intent(arg0, Myservice.class); 
PendingIntent pin = PendingIntent.getService(arg0, 0, in,PendingIntent.FLAG_UPDATE_CURRENT); 
Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(System.currentTimeMillis() + 1000 * 60); 
AlarmManager am = (AlarmManager) arg0.getApplicationContext().getSystemService(arg0.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), 30 * 1000, pin);