Мой оператор (я живу в Венесуэле) постоянно отправляет мне SMS, некоторые из них - дерьмо, некоторые из них меня волнуют, я действительно не хочу загружать приложение SMS с маркета, так как я делаю что-то очень конкретное и простое.
Основная идея: у меня есть BroadcastReceiver
, который фиксирует полученное SMS-намерение, для того, чтобы быть приятным для ОС, я здесь не выполняю никакой обработки (я хочу иметь возможность создавать правила настолько сложные, какЯ могу думать и у меня нет проблем с длительным запуском, возможно, с использованием БД или других асинхронных задач, которые не могут быть выполнены в BroadcastReceiver
), вместо этого я отправляю тот же Пакет в IntentService
, который обрабатывает SMS.
В целом это работает нормально, я могу остановить трансляцию, если я хочу избежать уведомления системы, что я получил SMS, и IntentService
отлично обрабатывает SMS.
Проблема:
Как мне обработать SMS в службе, а затем решить, хотел ли я, чтобы Система уведомляла, что я получил SMS?
Я бы очень хотел избежатьделать обработкувнутри BroadcastReceiver
.( Это имеет важные последствия для того, что вы можете сделать в реализации onReceive (Context, Intent): все, что требует асинхронной операции, недоступно, потому что вам потребуется вернуться из функции для обработки асинхронной операции, но при этомуказать, что BroadcastReceiver больше не активен, и, таким образом, система может свободно завершать свой процесс до завершения асинхронной операции. )
Я уже обрабатывал SMS, и, если он не соответствовал моим критериям, я мог быповторно выпустите передачу SMS Recive с дополнительным дополнением в комплекте, чтобы проверить, была ли она проверена ранее.Но я не могу заставить это работать.
Код:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(!intent.getExtras().getBoolean("previouslyChecked",false)){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle bundle = intent.getExtras();
if(!smsMatchesCriteria(bundle)){
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
bundle.putBoolean("previouslyChecked",true);
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2,"android.permission.RECEIVE_SMS");
}
}
}
Приемник вещания получает намерение и не отменяет вещание, но система не принимает SMS.Любые идеи?
Редактировать (В ответ на комментарий Бланделла):
Я подумал о том, что, возможно, добавление дополнительного может испортить его, поэтому я попробовал следующее:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int randomNum = (int)Math.ceil(Math.random()*100);
if(randomNum > 20){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i("SMSManager","Forwarding intent");
Bundle bundle = intent.getExtras();
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2, "android.permission.RECEIVE_SMS");
}
}
Выход LogCat:
02-10 22:06:24.632: I/SMSManager(424): RandomNumber: 74
02-10 22:06:24.673: I/SMSManager(424): Forwarding intent
02-10 22:06:24.683: I/SMSManager(424): RandomNumber: 64
02-10 22:06:24.803: I/SMSManager(424): Forwarding intent
02-10 22:06:24.824: I/SMSManager(424): RandomNumber: 28
02-10 22:06:24.832: I/SMSManager(424): Forwarding intent
02-10 22:06:24.854: I/SMSManager(424): RandomNumber: 14
Как видите, сообщение было скрыто от системы три раза, четвертый раз я не вызываю прерывание вещания, так как randomNumber меньше 20. ОСне показывает новое SMS ни во входящих, ни в панели уведомлений.