Как создать постоянные сигналы тревоги даже после перезагрузки
В настоящее время я работаю над приложением, которое работает как "To Do Task List". Я успешно реализовал NotificationService и SchedularService в своем приложении. Также я получаю оповещения (уведомления) в установленное для задач время. Вот мои запросы, как показано ниже:
- С помощью этого кода мои сигналы тревоги будут удалены после перезагрузки ? Если да, то как это преодолеть.
- я сохранил функцию приоритета для задач. Но я хочу механизм такой, что если пользователь выбирает приоритет "высокий", то он должен получать уведомления трижды, скажем, до 30 минут, до 15 минут и в установленное время. Как этого добиться ?
- я хочу установить функцию вибрирования телефона при появлении уведомлений. Как этого добиться ?
- и я хочу знать о том, что можно сделать для устаревших методов и конструктора в NotifyService.Ява. Thesse являются устаревшими на уровне 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);
...
Вот расписание занятий.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;
        }
    }
}
Вот служба расписания.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();
    }
}
Вот тревожная задача.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);
    }
}
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);