Как создать постоянные будильники даже после перезагрузки

В настоящее время я работаю над приложением, которое работает как «Список задач». Я успешно реализовал NotificationService и SchedularService в своем приложении. Также я получаю оповещения (уведомления) во время, установленное для задач. Вот мои запросы, как показано ниже:

  1. С этим кодом мои тревоги будут удалены после перезагрузки? Если да, то как это побороть.
  2. Я сохранил функцию «Приоритет» для задач. Но мне нужен такой механизм, чтобы, если пользователь выбирает приоритет «Высокий», он должен получать уведомления трижды, скажем, до 30 минут, до 15 минут и в установленное время. Как этого добиться?
  3. Я хочу установить функцию вибрации телефона при появлении уведомлений. Как этого добиться?
  4. И я хочу знать, что можно сделать для устаревших методов и конструктора в NotifyService.java. Они устарели на уровне API 11: Notification notification = new Notification(icon, text, time); и notification.setLatestEventInfo(this, title, text, contentIntent);. На сайте developer.android.com они предложили вместо этого использовать Notification.Builder. Итак, как сделать мое приложение совместимым со всеми уровнями API.

Вот мой фрагмент кода для планирования будильника:

...
scheduleClient.setAlarmForNotification(c, tmp_task_id);
...

Вот класс ScheduleClient.java:

public class ScheduleClient {

    private ScheduleService mBoundService;
    private Context mContext;
    private boolean mIsBound;

    public ScheduleClient(Context context)
    {
        mContext = context;
    }

    public void doBindService()
    {   
        mContext.bindService(new Intent(mContext, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {

            mBoundService = ((ScheduleService.ServiceBinder) service).getService();
        }

        public void onServiceDisconnected(ComponentName className) {

            mBoundService = null;
        }
    };

    public void setAlarmForNotification(Calendar c, int tmp_task_id){

        mBoundService.setAlarm(c, tmp_task_id);
    }

    public void doUnbindService() {
        if (mIsBound)
        {           
            mContext.unbindService(mConnection);
            mIsBound = false;
        }
    }
}

Вот ScheduleService.java:

public class ScheduleService extends Service {

    int task_id;

    public class ServiceBinder extends Binder {

        ScheduleService getService() {

            return ScheduleService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {

        return mBinder;
    }

    private final IBinder mBinder = new ServiceBinder();

    public void setAlarm(Calendar c, int tmp_task_id) {

        new AlarmTask(this, c, tmp_task_id).run();
    }
}

Вот AlarmTask.java:

public class AlarmTask implements Runnable{

    private final Calendar date;
    private final AlarmManager am;
    private final Context context;
    int task_id;

    public AlarmTask(Context context, Calendar date, int tmp_task_id) {
        this.context = context;
        this.am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        this.date = date;

        task_id = tmp_task_id;
    }

    @Override
    public void run() {

        Intent intent = new Intent(context, NotifyService.class);
        intent.putExtra(NotifyService.INTENT_NOTIFY, true);
        intent.putExtra("task_id", task_id);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        am.set(AlarmManager.RTC, date.getTimeInMillis(), pendingIntent);
    }
}

Вот NotifyService.java:

public class NotifyService extends Service {

    public class ServiceBinder extends Binder
    {   
        NotifyService getService()
        {
            return NotifyService.this;
        }
    }

    int task_id;
    private static final int NOTIFICATION = 123;
    public static final String INTENT_NOTIFY = "com.todotaskmanager.service.INTENT_NOTIFY";
    private NotificationManager mNM;
    SQLiteDatabase database;

    @Override
    public void onCreate() {

        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String tmp_task_brief = null;
        task_id = intent.getIntExtra("task_id", 0);

        loadDatabase();
        Cursor cursor = database.query("task_info", new String[]{"task_brief"}, "task_id=?", new String[]{task_id+""}, null, null, null);
        while(cursor.moveToNext())
        {
            tmp_task_brief = cursor.getString(0);
        }
        cursor.close();

        if(intent.getBooleanExtra(INTENT_NOTIFY, false))
            showNotification(tmp_task_brief);

        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {

        return mBinder;
    }

    private final IBinder mBinder = new ServiceBinder();

    private void showNotification(String tmp_task_brief) {

        CharSequence title = "To Do Task Notification!!";
        int icon = R.drawable.e7ca62cff1c58b6709941e51825e738f;
        CharSequence text = tmp_task_brief;     
        long time = System.currentTimeMillis();

        Notification notification = new Notification(icon, text, time);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, TaskDetails.class), 0);

        notification.setLatestEventInfo(this, title, text, contentIntent);

        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        mNM.notify(NOTIFICATION, notification);

        stopSelf();
    }

    void loadDatabase()
    {
        database = openOrCreateDatabase("ToDoDatabase.db",
                SQLiteDatabase.OPEN_READWRITE, null);
    }
}

person Chintan Soni    schedule 14.05.2013    source источник


Ответы (1)


С этим кодом мои тревоги будут удалены после перезагрузки? Если да, то как это побороть.

Да, будильник будет удален, чтобы преодолеть это, вам нужно использовать компонент Android под названием BroadcastReceiver следующим образом:

Во-первых, вам нужно разрешение в вашем манифесте:

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

Кроме того, в своем манифесте определите свою службу и прослушайте действие завершения загрузки:

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:enabled="true"
    android:exported="true"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Затем вам нужно определить приемник, который получит действие BOOT_COMPLETED и запустит вашу службу.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent serviceIntent = new Intent("com.myapp.NotifyService");
            context.startService(serviceIntent);
        }
    }
}

И теперь ваш сервис должен работать при запуске телефона.

2 для вибрации

Вам снова нужно определить разрешение в файле AndroidManifest.xml следующим образом:

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

Вот код вибрации,

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Vibrate for 300 milliseconds
v.vibrate(300);
person Lucifer    schedule 14.05.2013
comment
Итак, ваш ответ на вопрос... с этим кодом, при реализации, мои тревоги не будут удалены, не так ли? И должен ли я создать для этого отдельный java-файл или добавить этот класс как подкласс другого? - person Chintan Soni; 14.05.2013
comment
Да, будильник будет постоянным, так как он будет вызываться каждый раз при загрузке устройства. Вы можете создать в одном пакете, нет необходимости создавать другой пакет. - person Lucifer; 14.05.2013
comment
Извините, но можете ли вы показать, где реализовать свой код, поскольку я новичок в BroadCastReceiver - person Chintan Soni; 14.05.2013
comment
Конечно, точно так же, как вы создали новый класс для службы, вам нужно создать файл/класс для BroadcastReceiver. - person Lucifer; 14.05.2013
comment
Большое спасибо, друг. Я очень ценю ваши знания об Android. Так держать. Не могли бы вы сделать мне одолжение, помогая мне с оставшимися двумя запросами? - person Chintan Soni; 14.05.2013
comment
:( Дорогой, я сейчас нахожусь в фазе обучения. Это будет не так просто для меня. Но это нормально. Я сделаю это. Просто если бы ты помог мне, я бы быстро научился. В любом случае, еще раз, спасибо ... - person Chintan Soni; 14.05.2013
comment
Я хотел бы вам помочь, но сначала я хочу, чтобы вы сделали это сами, а когда вы застряли в части кода, приходите сюда с новым вопросом. Это поможет вам узнать что-то новое. - person Lucifer; 14.05.2013
comment
Хорошо, я пойду так, как ты мне показал. Ты прав. Я не должен просить о помощи, даже не пытаясь для этого. И спасибо, что подбодрил меня. - person Chintan Soni; 14.05.2013