Уведомление о тревоге не работает после перезагрузки

Я работаю над функцией уведомления о тревоге и хочу, чтобы она сохранялась после перезагрузки устройства. Он работает нормально, прежде чем я перезагружу устройство. После перезагрузки появляется ошибка (я не могу зарегистрировать ошибку для отладки... поэтому я не знаю, что это за ошибка на самом деле). Эта ошибка действительно приносит мне головную боль......

ОТРЕДАКТИРОВАНО: часть перезагрузки исправлена, я удаляю NOW() в запросе sqlite, и тогда он работает~~~но я все же хотел бы знать ответы на вопросы, как показано ниже. Спасибо :)

Кроме того, у меня также есть пара вопросов, например, как я могу отключить будильник, когда он истекает, и почему уведомление не вибрирует в моем приложении??? Спасибо.

вот мой код:

RebootReceiver

public class RebootReceiver extends BroadcastReceiver{
    private String TAG = "RebootReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "action: "+intent.getAction());
        SQLiteDatabase db = (new SupremeDB(context)).getReadableDatabase();

        String sql = "SELECT * "+
                    " FROM "+SupremeDB.ALARM_TABLE+
                    " WHERE 1";

        Cursor alarmCursor = db.rawQuery(sql, null);
        while (alarmCursor.moveToNext()){
            String eventType = "";
            switch(alarmCursor.getString(alarmCursor.getColumnIndex(SupremeDB.TABLE_NAME))){
            case SupremeDB.ONE_TO_ONE_TABLE:
                eventType = "One To One";
                break;
            case SupremeDB.DOOR_HOST_TABLE:
                eventType = "Door Host";
                break;
            case SupremeDB.TRAINING_TABLE:
                eventType = "Training";
                break;
            case SupremeDB.LONG_PRESENT_TABLE:
                eventType = "Long Present";
                break;
            }
            this.setAlarm(context, 
                    alarmCursor.getInt(alarmCursor.getColumnIndex(SupremeDB.ALARM_ID)), 
                    alarmCursor.getString(alarmCursor.getColumnIndex(SupremeDB.ALARM_DATE)), 
                    "You have a "+
                    eventType+
                    " on "+alarmCursor.getString(alarmCursor.getColumnIndex(SupremeDB.ALARM_DATE))
                    );
        }
    }

    public Calendar str2Calendar(String datetime){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(datetime);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            Log.e(TAG, e.toString());
            SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
            try {
                date = format2.parse(datetime);
            } catch (ParseException e1) {
                // TODO Auto-generated catch block
                Log.e(TAG, e1.toString());
            }
        }

        Calendar dateCalendar = Calendar.getInstance();
        dateCalendar.setTime(date);

        return dateCalendar;
    }

    public void setAlarm(Context context, int alarmId, String datetime, String message){
        Intent intent = new Intent(context, NotificationReceiver.class);
        intent.putExtra("message", message);
        intent.putExtra("alarm_id", alarmId);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar dateCalendar = this.str2Calendar(datetime);
        dateCalendar.set(Calendar.HOUR_OF_DAY, dateCalendar.get(Calendar.HOUR_OF_DAY)-2);

        AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC, dateCalendar.getTimeInMillis(), pendingIntent);
        Log.d(TAG, "alarm set: "+dateCalendar.getTimeZone().getDisplayName()+","+dateCalendar.getTimeInMillis()+", id:"+alarmId);
    }
}

и NotificationReceiver

public class NotificationReceiver extends BroadcastReceiver{
    private String TAG = this.getClass().getName();
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "action:"+intent.getAction());
        String message = intent.getStringExtra("message");
        int alarmId = intent.getIntExtra("alarm_id", 0);
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                .setVibrate(new long[]{500, 1000})
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle(context.getResources().getString(R.string.app_name))
                .setContentText(message);

        NotificationManager notifyMgr = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMgr.notify(context.getResources().getString(R.string.app_name), alarmId, mBuilder.build());
    }

}

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <receiver android:name="NotificationReceiver">

    </receiver>
    <receiver android:name="RebootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

person Simon    schedule 05.09.2014    source источник


Ответы (1)


Создайте класс, который расширяет BroadcastReceiver, и поместите код AlarmManager в его onReceive(), после чего вы сможете повторно зарегистрировать BroadcastReceiver в файле манифеста, как показано ниже.

<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver> Также добавьте разрешение в файл манифеста.

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

Вы также можете сослаться на этот пример.

Редактировать: Удалить тревогу вашего приложения.

Вы можете написать код для вибрации:

Vibrator vibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(500});
person Sagar Pilkhwal    schedule 05.09.2014
comment
проблема с перезагрузкой решена :) но я хочу знать, что здесь означает «категория»? - person Simon; 05.09.2014
comment
в чем проблема в вашем коде? Для категории обратитесь к этому сообщению или этому опубликовать. - person Sagar Pilkhwal; 05.09.2014
comment
что касается проблемы с перезагрузкой, я думаю, что ошибка возникает при ошибке запроса, что может означать, что NOW() не является эффективной командой для sqlite. Когда я редактирую его, теперь он работает нормально :) - person Simon; 05.09.2014
comment
используйте NOW для SQLite и NOW() для MySQL, попробуйте выполнить это на консоли SQLite `выберите datetime('NOW', 'localtime');` или select datetime('NOW'); - person Sagar Pilkhwal; 05.09.2014