0

Я новичок в этой части android, и здесь я хочу использовать диспетчер аварийных сообщений для запуска фрагмента кода каждые 2 минуты, который будет опроса сервера (с использованием api сайта) и на основе возвращенное JSON генерирует уведомление. После поиска в Интернете я подумал, что один из лучших вариантов в моем случае будет использовать намеренный сервис и андроид.AlarmManager Останавливает после удаления приложения из приложений recents

Manifest услуг и приемники

<service 
    android:name=".NotifyService" 
    android:enabled="true" 
    android:exported="false" > 
</service> 
<receiver 
    android:name=".TheReceiver" 
    android:enabled="true" 
    android:exported="true" > 
</receiver> 
<receiver 
    android:name=".OnOffReceiver" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

часть активности экрана вспышки, где я называю намерение служба, которая отвечает за опрос для уведомления:

Intent msgIntent = new Intent(this, NotifyService.class); 
    startService(msgIntent); 

Приемник для запуска сигнала тревоги на запуск устройства:

public class OnOffReceiver extends BroadcastReceiver 
{ 
    private AlarmManager alarmMgr; 
    private PendingIntent alarmIntent; 
    public OnOffReceiver(){} 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Intent service = new Intent(context, NotifyService.class); 
     service.setAction(NotifyService.CREATE); 
     context.startService(service); 
    } 
} 

Класс IntentService

public class NotifyService extends IntentService 
{ 
    public NotifyService() 
    { 
     super("NotifyService"); 
    } 
    public static final int STATUS_RUNNING = 0; 
    public static final int STATUS_FINISHED = 1; 
    public static final int STATUS_ERROR = 2; 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     if (intent != null) 
     { 
      final String action = intent.getAction(); 
     } 
     StartStuff(); 
    } 

    public void StartStuff() 
    { 
     Intent intent = new Intent(this, TheReceiver.class); 
     PendingIntent pend_intent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,1200,1200, pend_intent); 
    //1200ms to make it easier to test 
    } 

} 

Класс приемника, который устанавливает уведомление, для тестирования сана я не делаю какую-либо связанное с сетевой работы здесь просто сделать простое уведомление, чтобы проверить, если приложение работает во всех ситуациях

public class TheReceiver extends BroadcastReceiver 
{ 
    public TheReceiver(){} 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Toast.makeText(context, " Success ", Toast.LENGTH_SHORT).show(); 
     Log.d("Notification", "The Receiver Successful"); 
     showNotification(context); 

    } 
    private void showNotification(Context context) 
    {   
     NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context).setContentTitle("My notification").setContentText("Hello World!"); 
     mBuilder.setDefaults(Notification.DEFAULT_SOUND); 
     mBuilder.setAutoCancel(true); 
     NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(1, mBuilder.build()); 

    } 
} 

Однако уведомление появляется только при запуске приложения или в последнем лотке приложений. Он не начинает уведомлять, когда телефон перезагружается, а также не уведомляет о том, что приложение удаляется из последнего лотка приложений.

Приложение должно уведомлять пользователей, как и другие приложения (например, gmail, whatsapp), даже если они удалены из последнего лотка приложений. Своевременность и пунктуальность не очень важны, поскольку отсрочка до 5-10 минут допустима. (Я собираюсь проводить опрос каждые 2 минуты.)

Где я иду не так? Кроме того, есть ли лучший способ решить проблему?

ответ

3

Чтобы приемник активный после закрытия приложения является использование

android:process=":remote" 

в файле манифеста для приемника, который должен быть живым.

<receiver 
     android:name=".TheAlarmReceiver" 
     android:process=":remote"> 
</receiver> 

в манифесте для приемника (TheReceiver в данном случае), что мы должны вести активный образ жизни после того, как приложение закрывается.

P.S. : Я также изменил способ использования IntentsService и AlarmManager для приложения, поскольку моя предыдущая (выше) реализация - не очень хороший способ обойти это.

+0

Работает ли он сейчас? Если вы удалили приложение, вы получите вызов Broadcast Receiver? –

+0

Да. В текущей реализации FlashScreen устанавливает будильник. Затем (после каждого срабатывания будильника) широковещательный приемник (onReceive) выполняет IntentService, и вся оставшаяся работа выполняется там. Все журналы из службы Intent продолжаются даже после удаления приложения из последних приложений или спящего устройства. – sky

+0

Это не работает. Я последовал за всеми шагами. <приемник android: name = ". Recievers.AlarmReceiver" android: process = ": remote" android: excludeFromRecents = "true" /> –

1

Если приложение было убито из последних приложений или из «принудительной остановки», он не перезапустится сам по себе. Пользователь должен снова запустить приложение, чтобы снова запустить его. Невозможно предотвратить это. Это как раз то, как работает андроид.

Однако есть способ заставить приложение запускать загрузку. Проверьте this link.

+0

, но как же приложения, такие как gmail или приложение для погоды, выполняют одну и ту же функцию? Также ссылка загрузки не дала желаемого результата. Должен ли я пытаться использовать другой подход? – sky

+0

Они не выполняют ту же функцию. Попробуйте удалить WhatsApp из недавнего списка приложений.Вы увидите, что вы не будете получать сообщения без перезагрузки приложения или перезагрузки телефона. Ссылка загрузки должна работать. –

+0

Если работает липкая 'Сервис', она будет убита, когда пользователь вытащит свое приложение из ретентатов, но затем он будет перезапущен через несколько секунд. (На KitKat, во всяком случае.) –

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