2017-02-02 55 views
1

我有一个使用AlarmManager服务安排一些活动的应用程序。它大部分时间工作,但有时它不会发送广播,因此广播接收器不会收到任何东西(即使应用程序已启动并正在运行并且是前端活动)。我从TimePicker小部件读取闹钟时间。 这里是我的代码片段:Android:有时不会触发闹钟

设置报警:

private void setAlarm(int hour, int minute) { 
    //define intent and parameters 
    Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
    intent.putExtra(TAG_NAME, name); 
    intent.putExtra(TAG_ADDRESS, address); 
    intent.putExtra(TAG_AVERAGE, average); 
    intent.putExtra(TAG_DATABASE_ID, dbID); 
    //define alarm pedning intent 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(),(int)dbID, 
      intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //calculate alarm time 
    Calendar currentTimeCalendar = Calendar.getInstance(); 


    currentTimeCalendar.set(Calendar.HOUR_OF_DAY, hour); 
    currentTimeCalendar.set(Calendar.MINUTE, minute); 
    currentTimeCalendar.set(Calendar.SECOND, 0); 

    int h = currentTimeCalendar.get(Calendar.HOUR_OF_DAY); 
    int m = currentTimeCalendar.get(Calendar.MINUTE); 
    int s= currentTimeCalendar.get(Calendar.SECOND); 
    Toast.makeText(getApplicationContext(), "Hour "+h+":"+m+":"+s, Toast.LENGTH_LONG).show(); 


    SimpleDateFormat dateFormat = new SimpleDateFormat("DD-MMM-yyyy hh:mm:ss"); 
    String date = dateFormat.format(currentTimeCalendar.getTime()); 
    Log.v("VSB_TAG","Alarm Time: "+date); 
    // set alarm 
    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmMgr.set(AlarmManager.RTC_WAKEUP, currentTimeCalendar.getTimeInMillis(), alarmIntent); 

} 

广播接收器:

public class AlarmReceiver extends BroadcastReceiver { 
    public AlarmReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 
     Log.v("VHB_TAG", "Alarm Received"); 
     if (bundle == null) 
      return; 
     String name = bundle.getString(StudentDetailsActivity.TAG_NAME); 
     String address = bundle.getString(StudentDetailsActivity.TAG_ADDRESS); 
     double average = bundle.getDouble(StudentDetailsActivity.TAG_AVERAGE); 
     long dbID = bundle.getLong(StudentDetailsActivity.TAG_DATABASE_ID); 
     Toast.makeText(context, "Alarm for " + name, Toast.LENGTH_LONG).show(); 

     displayStudentNotification(context, name, address, dbID,bundle); 

    } 

    private void displayStudentNotification(Context context, String name, String address, long dbID, Bundle bundle) { 
     .... 
     .... 
    } 

} 

这里是清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="net.evegroup.studentslist"> 

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

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".StudentDetailsActivity" /> 

     <receiver 
      android:name=".AlarmReceiver" 
      android:enabled="true" 
      android:exported="true"></receiver> 
    </application> 

</manifest> 

回答

1

由于您的问题是间歇性的,因此问题可能不在于您显示的代码中。

如果设置了警报,它会触发,因此您需要检查您是否正确设置了警报或预期的警报。

您也可以用稍后设置的另一个覆盖警报。

+0

所以你说我发布的代码的整体逻辑似乎很好? – VSB

+0

我没有检查过它,但是你说代码有时候工作,所以你的问题更可能是代码的使用,而不是代码本身。 – Kuffs