Android AlarmManager立即启动

时间:2014-09-29 14:02:00

标签: android sqlite alarm notify vibrate

在我的数据库中,我有一个日期和时间列表,格式为“yyyy-mm-dd hh:mm”。在每个日期和时间,我想开始相应的通知。但相反,通知立即开始。有什么问题?

private void setAlarmFromDatabase(){            
        SQLiteDatabase db = mHelper.getReadableDatabase();
        String sql = "SELECT _id, riserva_3 FROM riserva";
        Cursor c = db.rawQuery(sql, null);          
         int count = c.getCount();
            long[] data_ora = new long[count];
            for(int i=0; i<count; i++) {
                c.moveToNext();    
                String id = c.getString(0);
                data_ora[i] = c.getLong(1);     

            }

        c.close();
    db.close();

     AlarmManager[] alarmManager=new AlarmManager[24];
        for(int ii=0;ii<data_ora.length;ii++)
        {
           alarmManager[ii] = (AlarmManager) getSystemService(ALARM_SERVICE);               

           Intent i = new Intent(getBaseContext(), Notifica_scadenza.class);

          PendingIntent displayIntent=PendingIntent.getBroadcast(getBaseContext(),ii,i,0);
          alarmManager[ii].set(AlarmManager.RTC_WAKEUP,(data_ora[ii]), displayIntent);
        }
        this.finish();
        overridePendingTransition(R.anim.right_in, R.anim.left_out);
        }

} BroadcastReceiver

public class Notifica_scadenza extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    // Vibrate the mobile phone
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(1000);
    showNotification(context);
}
private void showNotification(Context context) {
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, Inserisci_entrate_uscite.class), 0);

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.allarm_icon)
            .setContentTitle(context.getString(R.string.app_name))
            .setContentText(context.getString(R.string.titolo_scadenza));
    mBuilder.setContentIntent(contentIntent);
    mBuilder.setDefaults(Notification.DEFAULT_SOUND);
    mBuilder.setAutoCancel(true);

    NotificationManager mNotificationManager =
    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(1, mBuilder.build());

}  
}

Manifest中的权限

    <uses-permission android:name="android.permission.VIBRATE" android:required="false"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name="scad.Notifica_scadenza"></receiver>

1 个答案:

答案 0 :(得分:0)

与CommonsWare一样,提到的最可能的问题是日期转换。 在for循环之前,还定义了一个日期格式化程序,您可以使用它来格式化数据库中的接收日期。

final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());

现在在for循环中试试这个:

try {
    data_ora[i] = dateFormat.parse(cursor.getString(1)).getTime();
} catch (ParseException e) {
    Log.e(TAG, "Something wrong happened while parsing the date.", e);
}

您还可以注销数据,以查看数据是否正确(紧接在上一行之后)。

Log.i("YOUR_TAG", "The id is: " + id + ", and the time: " + data_ora[i]);