Как получить уведомления о андроиде, когда приложение было закрыто?

Из webserivce я получаю данные в виде дат и времени, значит, для какой-то конкретной даты у меня есть некоторый набор слотов. Следующая диаграмма дает подробное объяснение. enter image description here

Здесь на каждой дате у меня есть некоторый набор таймингов. Здесь я хочу отображать уведомление в конкретную дату и время. Если ответ из базы данных состоит из завтрашней даты, такой как 07/12/2012 в 11:00. Мне нужно отобразить уведомление в это время.

У меня есть идея относительно менеджера уведомлений и кода, который я использую.

Main.java

      NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_action_search, "A New Message!", System.currentTimeMillis());

    Intent notificationIntent = new Intent(this, Main.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    notification.setLatestEventInfo(Main.this, notificationTitle, notificationMessage, pendingIntent);
    notificationManager.notify(10001, notification);

Но здесь мне нужно получать уведомления, когда приложение также закрыто. Итак, кто-нибудь поможет мне в этом.

Ответ 1

Добавьте (приложение) Service к вашему приложению. Несмотря на то, что пользователь покинул приложение, служба все равно будет работать в фоновом режиме.

Кроме того, вы можете реализовать BroadcastReceiver, который будет прослушивать телефонные намерения и начать запуск вашего сервиса при загрузке телефона!

MyService.java

public class MyService extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    // START YOUR TASKS
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    // STOP YOUR TASKS
super.onDestroy();
}

@Override
public IBinder onBind(Intent intent){
    return null;
}

BootReceiver.java

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent serviceIntent = new Intent("your.package.MyService");
            context.startService(serviceIntent);
            }
        }
    }
}

AndroidManifest.xml

//в теге манифеста

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

//в вашем теге приложения

<service android:name=".MyService">
    <intent-filter>
        <action android:name="your.package.MyService" />
    </intent-filter>
</service>

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

Если вы хотите запустить свою услугу из одной активности, просто используйте

private boolean isMyServiceRunning() {
         ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
         for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
             if (MyService.class.getName().equals(service.service.getClassName())) {
                 return true;
             }
         }
         return false;
     }

if (!isMyServiceRunning()){
     Intent serviceIntent = new Intent("your.package.MyService");
     context.startService(serviceIntent);
}

Ответ 2

Если данные поступают с вашего сервера, то использование GCM может быть хорошим подходом. В этом случае сервер будет иметь возможность запускать/запускать ваше приложение.

Создание службы, которая постоянно работает в вашем случае, - это дрянное решение. Оптимальным подходом ИМО является использование AlarmManager. Менеджер аварийных сигналов будет ссылаться на намерение в определенное время. (обратите внимание, что при перезагрузке телефона вам необходимо снова зарегистрировать намерение).