Intereting Posts

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

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

  1. С помощью этого кода мои тревоги будут удалены после перезагрузки? Если да, то как это преодолеть.
  2. Я сохранил функцию Priority для задач. Но я хочу, чтобы механизм был таким, что если пользователь выбирает приоритет «Высокий», он должен получать уведомления трижды, скажем, до 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); } } в 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); } } 

Solutions Collecting From Web of "Как создавать постоянные аварийные сигналы даже после перезагрузки"

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

Да, сигнал тревоги будет удален, чтобы преодолеть это, вам нужно использовать компонент 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);