Как создать постоянные сигналы тревоги даже после перезагрузки
в настоящее время я работаю над приложением, которое работает как "список задач". Я успешно реализовал 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);
...
вот класс 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;
}
}
}
вот служба планировщика заданий.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);
}
}
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);