В моем приложении, где приложение получает новое sms-сообщение, я хочу, чтобы список немедленно обновлял его новым сообщением, отображаемым в списке. Я попытался использовать пример кода кода широковещательного приемника, но это не сработало, поэтому теперь я пытаюсь использовать таймер для обновления списка каждую секунду и отображения последнего полученного сообщения, но это тоже не работает.
final Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
inboxArrayAdapter.notifyDataSetChanged();
((BaseAdapter)inboxmessages.getAdapter()).notifyDataSetChanged();
handler.postDelayed(this, 1000 );
}
}, 1000);
return view;
Первоначальная попытка использования BroadcastReceiver для обновления списка при получении нового SMS-сообщения.
SmSBroadcastReceiver.java
public class SmsBroadcastReceiver extends BroadcastReceiver
{
public static final String SMS_BUNDLE = "pdus";
// https://javapapers.com/android/android-receive-sms-tutorial/
public void onReceive(Context context, Intent intent)
{
Bundle intentExtras = intent.getExtras();
if (intentExtras != null)
{
Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
String smsMessageStr = "";
for (int i = 0; i < sms.length; i++)
{
// Get sms message
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
// Get content and number
String smsBody = smsMessage.getMessageBody().toString();
String address = smsMessage.getOriginatingAddress();
// Create display message
smsMessageStr += "SMS From: " + address + "\n";
smsMessageStr += smsBody + "\n";
// Add it to the list
CommandsFragment inst = CommandsFragment.instance();
inst.updateList(smsMessageStr);
}
CommandsFragment inst = CommandsFragment.instance();
inst.updateList(smsMessageStr);
}
}
}
CommandsFragment.java
public static CommandsFragment instance()
{
return inst;
}
@Override
public void onStart() {
super.onStart();
inst = this;
}
public static CommandsFragment newInstance()
{
CommandsFragment fragment = new CommandsFragment();
return fragment;
}
public void updateList(final String smsMessage)
{
inboxArrayAdapter.insert(smsMessage, 0);
inboxArrayAdapter.notifyDataSetChanged();
}
Да, не делай этого. Вместо этого заставьте приемник работать.
Я могу убедиться, что обработчик работает, потому что я использовал Toast для отображения вывода каждую секунду.
Поместите код обновления списка в метод и вызовите этот метод из широковещательного приемника onReceive
. Это определенно сработает. Также проверьте код, правильно ли вы обновляете представление списка.
Я только что обновил вопрос своим кодом моей попытки кода широковещательного приемника.
Вы уверены, что в наборе данных есть какое-то обновление?
Используйте @override
для onReceive.
Да, в наборе данных есть обновление, потому что, когда я меняю экраны, список будет обновлен последним полученным смс-сообщением.
Я вставил @override для onReceive в SmsBroadcastReceiver.java, но все еще не обновлял список при получении нового SMS
где вы регистрируете свой ресивер
Приемник находится в другом файле класса с именем SmSBroadcastReceiver.java.
Поместите код обновления списка внутри метода в действии, которому принадлежит список, и вызовите этот метод из onReceive приемника вещания. Это определенно сработает. Также проверьте код, правильно ли вы обновляете представление списка.
public class SmsBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context paramContext, Intent intent) { // change the parameters depending upon your requirements
// do something here with the sms received if necessary
// then call the listview update method here
}
}
У меня уже есть этот код, взгляните на код CommandsFragment.java, который я выделил жирным шрифтом. В примере кода я получаю содержимое sms и обновляю список
Вы пытались войти в метод, чтобы проверить, достигает ли вызов метода?
Я поместил тег журнала в метод onReceive и проверил свой вывод отладки в Android Studio, я не думаю, что он достигает его.
Тогда как вы говорите, что получили смс? Вы получаете смс только через приемник!
Потому что, когда я перехожу к другому фрагменту или снова открываю приложение, список обновляется последним полученным смс.
Также, чтобы добавить к ответу, не забудьте указать это ниже в файле AndroidManifest.xml.
</activity>
<receiver android:name = ".SmsBroadcastReceiver">
<intent-filter>
<action android:name = "android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
Это выше также исправило решение для меня. Спасибо за помощь ребята.
Как насчет того, чтобы добавить ведение журнала, чтобы узнать, запускается ли когда-либо ваш обработчик? Кроме того, вы можете захотеть исправить форматирование вашего кода.