Я новичок в этой части 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 минуты.)
Где я иду не так? Кроме того, есть ли лучший способ решить проблему?
Работает ли он сейчас? Если вы удалили приложение, вы получите вызов Broadcast Receiver? –
Да. В текущей реализации FlashScreen устанавливает будильник. Затем (после каждого срабатывания будильника) широковещательный приемник (onReceive) выполняет IntentService, и вся оставшаяся работа выполняется там. Все журналы из службы Intent продолжаются даже после удаления приложения из последних приложений или спящего устройства. – sky
Это не работает. Я последовал за всеми шагами. <приемник android: name = ". Recievers.AlarmReceiver" android: process = ": remote" android: excludeFromRecents = "true" /> –