2016-01-09 4 views
1

Я создаю приложение, в соответствии с которым уведомление будет звонить в определенное время и после которого исчезнет, ​​если он останется без присмотра в течение 15 минут. Он работает, когда я подключаю свое устройство и запускаю код. Однако, как только я отключу свое устройство и запускаю приложение, уведомление работает, но оно не исчезает через 15 минут, если оно остается без присмотра. Пожалуйста, советую мне, как я должен запускать приложение, как это происходит, когда устройство подключается к компьютеру. Кроме того, он должен работать, когда приложение будет убито.IntentService не работает

FYI, я пользуюсь уведомлением, будильником, широковещательным приемником и intenservice. Ниже приведен фрагмент моих кодов.

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver { 

@Override 

public void onReceive(Context context, Intent intent) { 

    Notification(context, "Wifi Connection On"); 
    Intent background = new Intent(context, BackgroundService.class); 
    context.startService(background); 
} 

public void Notification(final Context context, String message) { 
// notification codes 

    } 

} 

BackgroundService.java

public class BackgroundService extends IntentService { 

public BackgroundService() { 
    super("BackgroundService"); 
} 


@Override 
protected void onHandleIntent(Intent intent) { 
    //countdown 15 minutes and cancel notification automatically 
    Timer timer=new Timer(); 
    TimerTask task=new TimerTask() { 

     @Override 
     public void run() { 
      // Create Notification Manager 
      NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      // Dismiss Notification 
      notificationmanager.cancelAll(); 

     } 
    }; 

    timer.schedule(task, 900000); 

} 
} 

Manifest.xml

<receiver android:name=".AlarmReceiver" android:process=":remote" /> 
<service android:name=".BackgroundService" /> 

Просьба предоставить мне несколько советов. Спасибо.

+2

Попробуйте использовать 'AlarmManager' вместо' Timer'. После того, как ваше обслуживание будет обработано, оно будет уничтожено вместе с вашим таймером. – SqueezyMo

+0

привет, им новичок. у вас есть пример того, как реализовать аварийный сигнал в службе намерений, так как у меня уже есть одна в моей mainactivity. @SqueezyMo – redblackwhite

+0

См. Ответ. – SqueezyMo

ответ

1

Эта услуга будет работать в два раза: первый раз, когда он не делает ничего, кроме перепланирования , второй раз он отменяет уведомления.

public class BackgroundService extends IntentService { 
    private static final int REQUEST_CODE = 42; 
    private static final String ACTION_CANCEL_NOTIFS = "CancelNotifications"; 

    public BackgroundService() { 
     super("BackgroundService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (intent != null && ACTION_CANCEL_NOTIFS.equals(intent.getAction())) { 
      NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      notificationmanager.cancelAll(); 
     } 
     else { 
      reschedule(); 
     } 
    } 

    private void reschedule() { 
     final Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.add(Calendar.MINUTE, 15); 

     final Intent serviceIntent = new Intent(this, getClass()); 
     serviceIntent.setAction(ACTION_CANCEL_NOTIFS); 
     PendingIntent pendingIntent = PendingIntent.getService(this, REQUEST_CODE, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } 
} 

Объяснение:

В своем коде, я полагаю, вы начинаете свой сервис с startService(new Intent(this, BackgroundService.class)). Это намерение передается в качестве параметра в onHandleIntent(Intent), что означает, что вы можете получить доступ к нему из своей службы.

Intent позволяет передавать дополнительные данные, например, действие (полезно для IntentFilter s) или дополнительные услуги. Поскольку вы не задали никаких параметров, первый раз, когда выполнение выполняется, переходит в ветвь else метода onHandleIntent(). AlarmManager планируется запустить в течение 15 минут с serviceIntent. Примечание serviceIntent.setAction(ACTION_CANCEL_NOTIFS). Таким образом, второй раз, когда выполнение выполняется, переходит в ветвь if и отменяет уведомления.

Лучшим подходом было бы создание ожидающего намерения прямо из вашей деятельности вместо запуска службы с startService. Это сделает ваш сервис более простым и более сплоченным.

+0

, он удаляет уведомление сразу же после его появления вместо 15 минут. – redblackwhite

+0

Каждый раз, когда он запускается, он отменяет уведомления и перенаправляет себя. Вот почему я оставил этот комментарий. Просто передайте дополнительные данные в намерении и проверьте, есть ли он там. – SqueezyMo

+0

Мне не нужно его перепланировать, но мне нужно что-то подобное при каждом запуске службы, он добавляет 15 минут к текущему времени и автоматически удалит уведомление, если он оставлен без присмотра за этот период в 15 минут. – redblackwhite

-2

Служба работает только при бодрствовании процессора. Если CPU выключится, обслуживание не будет запущено.

ИСПОЛЬЗУЙТЕ, чтобы ваш сервис выполнялся, если телефон переспал, вам необходимо подключить замок слежения.

BackgroundService класс

public class BackgroundService extends IntentService { 

private PowerManager.WakeLock wl; 

public BackgroundService() { 
    super("BackgroundService"); 

} 


@Override 
protected void onHandleIntent(Intent intent) { 

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Partial lock permission"); 

    wl.acquire(); 
    //countdown 15 minutes and cancel notification automatically 
    Timer timer=new Timer(); 
    TimerTask task=new TimerTask() { 

     @Override 
     public void run() { 
      // Create Notification Manager 
      NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      // Dismiss Notification 
      notificationmanager.cancelAll(); 

      wl.release(); 

     } 
    }; 

    timer.schedule(task, 900000); 

} 
} 

Если это сработает, попробуйте дать ниже разрешения в Android Manifest файл

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

привет, я попробовал, приложение остановилось. – redblackwhite

+0

Можете ли вы дать мне исключение из журнала –

+0

В строке BackgroundService 24 есть ошибка. Это относится к PowerManager pm = (PowerManager) getSystemService (Context.POWER_SERVICE); – redblackwhite

Смежные вопросы